一直从事Linux下的开发,大型并发网络通讯和应用服务等软件开发,原来也做过不少Linux内核方面的开发,比如,防火墙计费系统、VPN网络设备等。最近由于公司需要,接触了一些硬件方面的开发,感觉硬件开发其实也不是那么复杂,只要有芯片规范,读懂了就很轻松了。
我们要实践的是一个嵌入式系统硬件环境检测的抽象平台,这个硬件抽象平台是为了上层应用更好更方便地编程。如图:
关于设计方面不想太多描述,这里说一些关键技术点。
GPIO是一种通用I/O协议,在读写的时候,需要对特定寄存器进行一些设置,在规范描述的时候,一般会说GPIO 0-12,GPIO 38-43等说法,GPIO和一般的寄存器读写很不一样,因此它是两个号码控制一个状态。
GPIO的一般读写顺序为:
1、首先设置需要进行操作的GPIO范围;
2、在读/写操作前,对GPIO的选择寄存器设置为1/0;
3、读/写寄存器(基地址+偏移)。
由于我进行开发的是Intel公司生产的6300ESB芯片,这个芯片上支持很多PCI设备,我要访问控制的设备位于LPC里,我通过PCI查找函数,获得访问PCI卡的地址,然后再获取GPIO的基地址,其它就很简单了。
CFLAGS += $(shell [ -f /lib/modules/$(shell uname -r)/build/include/linux/modversions.h ] && echo -DEXPORT_SYMTAB -DMODVERSIONS -include /lib/modules/$(shell uname -r)/build/include/linux/modversions.h )
如果不加入上述语句,在执行“depmod -a”命令时,会出现以下错误:
depmod: *** Unresolved symbols in /lib/modules/2.4.21-166-default/misc/xxxxx.o