Linux字符设备驱动模型之点亮LED灯
emap宏函数来实现物理地址到虚拟地址的映射。
以上操作即为LED设备驱动的初始化函数led_init的实现,源码如下:
4.设备模块卸载
设备模块的卸载主要实现将设备号释放,销毁设备节点文件、销毁设备类,释放所申请的内存空间。
5.操作函数集的实现
如上图可知,一共实现了3个操作函数。分别对应于用户空间的open、close和ioctl系统调用的操作。其中led_open操作函数的实现主要进行硬件寄存器的初始化配置。
如上图即是配置GPC0CON寄存器,将GPC0_3和GPC0_4口配置为输出模式,并初始化GPC0DAT寄存器,保证初始状态为灯灭。
操作函数led_close的实现不实现任何操作。为空函数。
6.led_ioctl操作函数的实现
如上图所示,led_ioctl函数通过接受从用户空间传递而来的命令cmd,来决定LED设备的亮灭。以上这种方式是通过直接操作寄存器的方式来实现。实际上在Linux内核中提供了相应的读写寄存器的函数方法来实现操作,如下图:
除了这种方法之外,要操作GOIO口,更可以使用gpio_get_value和gpio_set_value这样的函数来进行配置GPIO口,对于GPIO口的配置方式,还有更多的实现。
三、Linux用户空间操作硬件设备
应用程序的实现思路是,从外表为用户程序提供命令来进行操作LED灯,main函数从外表接收两个命令:
命令的执行状态为:./app_led LED编号 状态
·编号可取值1,2,3,分别表示LED1,LED2和全部LED。
·状态可取值0和1,分别表示灯亮和灯灭。
首先实现判断外表命令的输入情况,打开设备文件/dev/led,和将命令由字符转化为整数。
然后就是点灯功能的实现了。
四、验证现象
分别编译好内涵驱动模块和应用程序,分别得到led_driver.ko文件和app_led文件,然后将他们都拷贝到开发板根文件系统。
执行命令:insmod led_driver.ko插入内核驱动模块。最后执行应用程序./app_led进行操作LED。如下图:
至此!整个点灯实现完成。
- DSP在LED大屏显示中的应用(03-14)
- DSP在LED显示中的应用(08-21)
- 基于μC/OS2II的LED显示屏控制器(08-14)
- 基于DSP的LED大屏幕显示系统(10-03)
- 基于单片机的彩灯设计方案(10-29)
- 基于μC/OS-II及Nios II的多窗口显示屏控制器的设计与实现(01-23)