全志A33-gpio驱动程序
開發環境
Ubuntu:14.04
開發板:A33-Vstar
開發板系統:android 4.4 、linux-3.4.39
交叉編譯器:arm-linux-gnueabi-gcc 4.7.3
-----------------------------------------------------
?
1. 驅動程序
1)采用Linux gpio api,具有很好的移植性
2)采用misc設備,自動創建設備節點 /dev/leds
3)驅動代碼:A33-gpio.c
#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <mach/gpio.h> #include <linux/gpio.h> #include <linux/miscdevice.h>static int led_gpios[] = {GPIOH(7), };#define LED_NUM ARRAY_SIZE(led_gpios)int leds_open(struct inode *inode,struct file *filp) {printk("leds device opened success!\n");return nonseekable_open(inode,filp); //通知內核你的設備不支持llseek }int leds_release(struct inode *inode,struct file *filp) {printk("leds device closed success!\n");return 0; }long leds_ioctl(struct file *filp,unsigned int cmd,unsigned long arg) {printk("debug: leds_ioctl cmd is %d\n" , cmd);switch(cmd){case 0: //不加break,執行case1case 1:if (arg > LED_NUM) {return -EINVAL;}gpio_set_value(led_gpios[arg], cmd);break;default:return -EINVAL;}return 0; }static struct file_operations leds_ops = {.owner = THIS_MODULE,.open = leds_open,.release = leds_release,.unlocked_ioctl = leds_ioctl, };static struct miscdevice leds_dev = {.minor = MISC_DYNAMIC_MINOR,.fops = &leds_ops,.name = "leds", //此名稱將顯示在/dev目錄下面 };static int __init leds_init(void) {int ret, i;char *banner = "leds Initialize\n";printk(banner);for(i=0; i<LED_NUM; i++){//申請gpio,設置為輸出,高電平ret = gpio_request_one(led_gpios[i], GPIOF_OUT_INIT_HIGH,"LED");if (ret) {printk("leds: request GPIO %d for LED failed, ret = %d\n", led_gpios[i], ret);return ret;}}ret = misc_register(&leds_dev);if(ret<0){printk("leds: register device failed!\n");goto exit;}return 0;exit:misc_deregister(&leds_dev);return ret; }static void __exit leds_exit(void) {misc_deregister(&leds_dev); }module_init(leds_init); module_exit(leds_exit);MODULE_LICENSE("Dual BSD/GPL");?
2. Linux應用程序
gpio-test.c
//gpio控制,循環輸出高低電平 //android compile: arm-linux-gnueabi-gcc -o gpio-test gpio-test.c -static //linux compile: arm-linux-gnueabi-gcc -o gpio-test gpio-test.c#include <stdio.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h>#define GPIO_HIGH 1 #define GPIO_LOW 0#define GPIO_H7 0 //led_gpios[0]=PH7int main() {int fd = 0;int cmd;int arg = GPIO_H7;/*打開設備文件*/fd = open("/dev/leds", O_RDWR);if (fd < 0){printf("open Dev /dev/leds Error!\n");return -1;}printf("running\n");while(1){cmd = GPIO_HIGH;if (ioctl(fd, cmd, arg) < 0){printf("ioctl fail\n");return -1;}printf("GPIO_H7 value is 1\n");sleep(2);cmd = GPIO_LOW;if (ioctl(fd, cmd, arg) < 0){printf("ioctl fail\n");return -1;}printf("GPIO_H7 value is 0\n");sleep(2);}close(fd);return 0; }?
3. 驗證
3.1 開發板運行Android
1)mount -o rw,remount / 重新掛載根文件系統,否者可能提示:Read-only file system
1)adb push gpio-test /
2)adb push A33-GPIO.ko /
3)insmod A33-GPIO.ko
4)chmod 777 gpio-test
5)./gpio-test
?
6)用萬用表測量PH1腳變化。
3.2 開發板運行linux
1)Ubuntu執行:sudo minicom 連接開發板
2)按 ctrl+A,選擇Z,再選S,發送A33-GPIO.ko和gpio-test到開發板
3)開發板執行: insmod A33-GPIO.ko
4)開發板執行:./gpio-test
5)用萬用表測量PH7腳變化。
?
注:當開發板運行linux時,需將引腳PH1改為PH7,因為PH1在linux下被占用。
?
?
總結
以上是生活随笔為你收集整理的全志A33-gpio驱动程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全志A33-ARM开发板通过NFS与Ub
- 下一篇: 三星 Galaxy S23 系列更多保护