之前,我们已经基本学习了如何编写简单的字符设备驱动程序。在本节中,我们来看看Friendly Arm提供的LED驱动器。参考之前写的文章,我们已经知道LED的GPIO端口和一些配置信息:http://blog.csdn.NET/morixinguan/article/details/50619675在Friendly Arm提供的内核中,已经有一个文件对这些GPIO对应地打包在driver / gpio / gpio_dvs / exynos4x12_gpio_dvs.c中:我们打开该文件,并找到与LED对应的四个IO端口的宏,如下所示:EXYNOS4212_GPM4(0),EXYNOS4212_GPM4(1),EXYNOS42 (2),EXYNOS4212_GPM4(3),要操作GPIO,我们需要这三个.h标头文件#include& lt; Linux / gpio.h& gt; #include& lt; mach / gpio.h& gt; #include& lt; plat / gpio-cfg .h>这些头文件是通用的,并且与平台有关。需要以下功能:gpio_request gpio_set_value s3c_gpio_cfgpin gpio_set_value gpio_free接下来看一下源代码的注释分析:#include& lt; linux / kernel.h& gt; #include& lt; linux / module.h& gt; #include& lt; linux / miscdevice.h& gt; #include& lt; linux / fs.h& gt; #include& lt; linux / types.h& gt; #include& lt; linux / moduleparam.h& gt; #include& lt; linux / slab.h& gt; #include& lt; linux / ioctl.h& gt; #include& lt; linux / cdev.h& gt; #include& lt; linux / delay.h& gt; & nbsp; #include& lt; linux / gpio.h& gt; #include& lt; mach / gpio.h& gt; #include& lt; plat / gpio-cfg .h& gt; #define DEVICE_NAME“ leds” //找到与LED引脚对应的宏static int led_gpios [] = {EXYNOS4212_GPM4(0),EXYNOS4212_GPM4(1),EXYNOS4212_GPM4(2),EXYNOS4212_GPM4(3),LED_NUM; ARRAY_SIZE(led_gpios)//操作LED灯//传入1,/传入//传入0,关闭静态长tiny4412_leds_ioctl(结构文件* filp,unsigned int cmd,unsigned long arg){switch(cmd){case 0:情况1:if(arg& gt; LED_NUM){return -EINVAL;} // LED点亮为低电平,1点亮,0熄灭,因为cmd执行了反向操作// gpio_set _value此功能将为IO分配一个值gpio_set_value(led_gpios [arg],!cmd); // printk(DEVICE_NAME&quot ;:%d%d
&quot ;, arg,cmd);休息;默认值:return -EINVAL;} return 0;} // led操作文件结构静态结构file_operations tiny4412_led_dev_fops = {.owner = THIS_MODULE,.unlocked_ioctl = tiny4412_leds_ioctl,}; //其他设备结构静态结构miscdevice tiny4412_led_dev = {.minor = MISC_DYNAMIC_MINOR,.name = DEVICE_NAME,.fops =& tiny4412_led_dev_fops,}; //引导驱动程序加载静态int __init tiny4412_void_dev_init(i){int ret;我for(i = 0; i& lt; LED_NUM; i ++){//注册并申请用于GPIO的存储器,并命名设备驱动器LED ret = gpio_request(led_gpios [i],“ LED”); if(ret){printk(“%s:请求LED的GPIO%d失败,ret =%d
”,“ DEVICE_NAME”,led_gpios [i],ret); return ret;} //调用此函数并将所有IO设置为输出状态s3c_gpio_cfgpin(led_gpios [i],S3C_GPIO_OUTPUT); //默认情况下,所有IO均已初始化Bright gpio_set_value(led_gpios [i],1);} //其他设备注册ret = misc_register(& tiny4412_led_dev); printk(DEVICE_NAME'已初始化
”); return ret;} static void __exit tiny4412_led_dev_exit(void){int i; for(i = 0; i& lt; LED_NUM; i ++){//释放请求的IO和内存gpio_free(led_gpios [i]);} //取消注册其他设备驱动程序misc_deregister(& tiny4412_led_dev);} module_init (tiny4412_led_dev_init); module_exit(tiny4412_led_dev_exit); MODULE_LICENSE(“ GPL”); MODULE_AUTHOR(“ FriendlyARM Inc.”);有了这个框架,我们可以采用Modified,我们可以继续向tiny4412_led_dev_fops添加读取,写入,关闭,lseek函数,以实现其他LED操作。有兴趣的学生可以尝试一下。我之前已经测试过这些驱动程序,这里只是对这些知识点进行了再次总结。