switch (dev_function)
{
case PCI_DEV1: set_gpio1_high(); //置相应的GPIO为高
case PCI_DEV2: set_gpio2_high();
default:break;
}
另外一项需要修改的PCI初始化代码是有关PCI设备的中断号分配。对于没有BIOS的嵌入式Linux,PCI设备中断号分配是由内核根据板子的硬件连线来决定的。一般嵌入式设备不需要中断路径互连器,直接把插槽的/INT管脚与CPU的IRQ线相连。连接方法有很多种,如把一个插槽的四个中断脚都连到一个IRQ上,由操作系统来控制中断的复用关系,也可以一个PCI中断管脚只连一个IRQ线。所以PCI IRQ的分配这部分Linux代码要根据各开发板实际的中断连接方法来修改。
在我们的开发板里,每个PCI的/INT管脚都连接到一单独的IRQ线上,根据这种连接关系,我们从软件上可以构造出下面这样一张表:
/* arch/ppc/platforms/our_board_name.c:ppc405_map_irq ()*/
static char pci_irq_table[][4] =
/* PCI /INT PIN->INTLINE
* A B C D */
{
{28, 29, 30, 30}, /* IDSEL 1 - PCI 插槽 1 */
{31, 31, 31, 31}, /* IDSEL 2 - PCI 插槽2 */
};
上表描述的PCI插槽1的/INT A中断的号是28,而这个28号中断的由来是该槽的/INT A与CPU的28号中断的IRQ线相连了。把所有PCI插槽的中断线与CPU IRQ线的连接关系填入表中,就可以通过内核里标准的PCI初始化代码正确分配各PCI设备的中断号了。当然,在板子的IRQ初始化部分(arch/ppc/platforms/our_board_name.c:board_setup_irq())还要正确设置这些分配了的中断线的触发方式,极性等。
Linux内核的移植牵涉到很多硬件的知识,对开发板的硬件原理图有比较清楚的认识可以对移植工作有事半功倍的效果。
结束语
有了bootloader,内核,再利用Busybox[4][5]来构建一个简单的根文件系统后,这个嵌入式Linux系统平台就已经搭建完毕,用前述过程所搭建的嵌入式Linux系统平台体积小,功能强,运行稳定,对于像数字视频播放机这种需要长期工作运行的设备而言非常适合,而且升级性强,对于未来的一些应用需求,可以通过开发板上的PCI、USB、Ethernet等接口进行扩展,可以说是为以后设备的进一步功能增强奠定了坚实的基础。本论文的创新点在于将传统的视频播放设备的简单控制系统升级为嵌入式Linux系统,并对嵌入式Linux系统的构建和移植作了详细探讨,特别是根据PCI设备的新连接方法提出了一种新的初始化算法,具有很强的应用价值。
参考文献
1陈 福等,基于嵌入式系统的视频图像捕获研究与实现,《微计算机信息》,2005年第 12-2期,P12-13、P70
2 http://www.denx.de
3 http://www.denx.de/twiki/bin/view/DULG/Manual
4 http://www.busybox.net
5 Karim Yaghmour,Building Embedded Linux System.,O’Reilly, 2004