因为前面写裸板程序的时候,已经详细的叙述过LED灯的控制,按键的控制,以及watchdog的配置,这里就不赘述了,主要是说明模块如何控制底层硬件的。
第一个程序是模块程序控制LED灯全亮。
因为友善之臂将LED灯的驱动默认加载到内核中,编写模块驱动程序前就要先把原先的LED灯驱动裁剪掉。
首先进入linux源码目录。执行 make menuconfig
进入Device Drivers --->
Character devices --->
将LED Support for FriendlyARM Tiny4412 GPIO LEDs前的去掉。
保存退出后执行make 重新编译内核,用重新生成的内核镜像启动Tiny4412.
编写裸板驱动和编写模块驱动的区别在于,裸板程序直接操作的是物理内存,而模块程序操作的是虚拟内存,模块程序要操作硬件,肯定是要通过物理地址来操作相应的寄存器的值。这时候,就是要通过ioremap()函数,实现物理地址(IO地址空间)到虚拟地址的转换。下面是具体程序:插入模块时灯全亮。
1 #include <linux/init.h> 2 #include <linux/module.h> 3 #include <asm/io.h> 4 5 MODULE_LICENSE("GPL"); 6 MODULE_AUTHOR("BUNFLY"); 7 8 unsigned long gpio_virt; 9 unsigned long *gpm4con, *gpm4dat; 10 11 int test_init() 12 { 13 gpio_virt = ioremap(0x110002e0 & ~0xfff, SZ_4K);//映射4k空间 14 gpm4con = gpio_virt + (0x110002e0 & 0xfff); 15 gpm4dat = gpio_virt + (0x110002e4 & 0xfff); 16 17 *gpm4con = 0x1111; 18 *gpm4dat = 0; 19 20 return 0; 21 } 22 23 void tes