Android驱动例子(LED灯控制)(2)

ssize_t GPIO_VIB_read(struct file * file,char * buf,size_t count,loff_t * f_ops); ssize_t GPIO_VIB_write (struct file * file,const char * buf, size_t count,loff_t * f_ops); static int GPIO_VIB_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg); ssize_t GPIO_VIB_open(struct inode * inode,struct file * file); ssize_t GPIO_VIB_release(struct inode * inode, struct file * file); static int GPIO_VIB_CTL_init(void);

Kconfig 文件

Kconfig 文件

config LEDTEST   tristate "LED test for ARMeasy"   default n   help   this is a LED driver for ARMEASY with S3C6410

Makefile文件

Makefile文件

obj-$(CONFIG_LEDTEST)+=leddriver.o

3、在内核配置里菜单里加入本驱动的配置项

达到的效果是,可以通过内核配置来选择是否把本驱动编译进内核里,也就是出现在make menuconfig 后出来的界面里,可以参考9.8章<Android添加新驱动方法>

1)在arch/arm/Kconfig文件里 menu "Device Drivers"与 endmenu之间添加

source "drivers/ledtest/Kconfig"

2)在drivers/Kconfig menu "Device Drivers" 和 endmenu之间添加

source "drivers/ledtest/Kconfig"

3)修改/drivers/Makefile文件

Obj-$(CONFIG_LEDTEST) +=ledtest/

4、编译驱动

在kernel目录下,终端输入

#make menuconfig

“Device Drivers” 下面会看到 “LED test for ARMeasy”,选择它,

保存并退出

#make

这样,就会在/drivers/ledtest目录下得到leddrivr.ko文件,它就是驱动目标文件,已级编译进了zImage 里了,只要用这个kernel烧录到开发板,开机就会自动加载本驱动,

PS,如果发现如上编译,没有在ledtest目录下生成leddriver.ko文件,也就是本根没有去编译本驱动,那就把ledtest目录入到/drivers/misc目录下,相应的修改misc下面,然后,在makefile里,不用选直接写成obj-y += leddriver.o,这样强制的包含进去编译。

三、 应用程序(测试驱动)

用C语言写一个应用,测试上面写的驱动是否工作正常,这是一般的驱动开发流程

主要有两个文件:Android.mk和ledtest.c

1、

在$(YOUR_ANDROID)/external/LEDTEST/目录编写ledtest.c文件,

ledtest.c

ledtest.c

#include <stdio.h> #include <stdlib.h> #include <fcntl.h> // contact the open(),close(),read(),write() and so on!   #define DEVICE_NAME "/dev/vib"//device point #define LED_ON     0x11 #define LED_OFF     0x22 int main(int argc,char **argv) {        int fd;     int ret;     char *i;     printf("\n start gpio_led_driver test \r\n");     fd = open(DEVICE_NAME,O_RDWR);//Open device ,get the handle     printf("fd = %d \n",fd);     if(fd == -1) //open fail     {       printf("open device %s error \n",DEVICE_NAME);     }     else     {         while(1)         {           ioctl(fd,LED_OFF); //call the output function to off LEDs           sleep(1);//wait 1 second           ioctl(fd,LED_ON);           sleep(1);         }         ret = close(fd); //close device         printf("ret = %d \n",ret);         printf("close gpio_led test \n");     }   return 0; }

2、在$(YOUR_ANDROID)/external/ LEDTEST /目录编写Android.mk文件。这是Android Makefile的标准命名,不要更改。Android.mk文件的格式和内容可以参考其他已有的Android.mk文件的写法,针对helloworld程序的Android.mk文件内容如下:

Android.mk

  LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= \\par     hello.c LOCAL_MODULE := ledtestapp include $(BUILD_EXECUTABLE)

注意上面LOCAL_SRC_FILES用来指定源文件;

LOCAL_MODULE指定要编译的模块的名字,下一步骤编译时就要用到;

include $(BUILD_EXECUTABLE)表示要编译成一个可执行文件,如果想编译成动态库则可用BUILD_SHARED_LIBRARY,这些可以在

$(YOUR_ANDROID)/build/core/config.mk查到。

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwxjwz.html