在系统开发中,X86体系使用较多。X86体系中经常遇到的问题就是如何把PCI总线上设备的资源映射到系统中,准确的说是:把PCI总线上的物理资源映射成CPU的本地资源。有两种处理方式:动态寻找和静态指定。静态指定适合硬件完全可以确定的情况,动态寻找主要用在系统中硬件不能确定的情况。静态指定。系统中使用卡的数目已知,卡上的IO地址和内存地址固定已知,可以直接在syslib.C文件中修改。比如卡上IO空间的基地址为0x3000,大小为Oxl00, 内存空间基地址为0xee000000, 大小为0xl00000,在syslib.C文件中找到PHYS_MEM_DESC结构,在其中加上对卡IO空间和内存空间的说明如下: #define INIT_STATE_MASK (|VM_STATE_MASK_ WRITABLE | VM_STATE_MASK_CACHEABLE) #define INIT_STATE (VM_STATE_VALID | VM_STATE_WRITABLE |VM_SlTATE_CACHABLE_NOT) PHYS_MEM_DESC sysPhysMemDesc={ ..... { (void )0xee000000, //映射到cpu端的基地址 (void )0xee000000, //卡上内存的基地址 0x1000, //卡上内存的大小为4k INIT_STATE_MASK//卡上内存初始化状态的掩码 INIT_STATE //卡上内存的状态 }, ... } 这样系统在每次启动后都会把该结构中指定的IO空间和内存空间放到内存映射表中,驱动程序可以直接使用这些地址读写。 动态寻找。系统中使用的卡的数量不确定,需要在系统启动时才可确认,这样的情况下使用动态寻找动态寻找要确定资源的类型(IO或内存),大小和基地址。一般把这段代码放到一个文件里,然后在syslib.c(位于$(HOME) arget/conilg/bsp_type/下)中把这段代码包含进去。在该文件中的硬件初始化函数void sysHwInit(void)调用该代码映射PCI资源的一般过程大概如下:扫描PCI总线,找到总线上的感兴趣的硬件,然后查询该硬件上的资源信息,最后配置该硬件的资源信息让VxWorks系统知道. 如何支持SELECT() 在驱动程序中支持select()机制可以让任务同时等待从多个设备来的输入并设置等待某个设备输入的超时时间。在驱动程序中添加select机制很容易, selectLib库提供了这方面的支持。驱动程序要做的工作如下:首先,在设备描述结构里声明一个SEL_WAKEUP_UST结构并在设备创建函数里调用唤醒表初始化函数selWakeupListInit()来初始化该结构;当函数ioctl()被调用时(参数为FIOSELECT),应该用节点增加函数selNodeAdd0把函数ioctl()中的参数SEL_WAKEUP_LIST加到链表SEL_WAKEUP_LIST中;然后用唤醒类型函数selWakeupType检查任务是读设备还是写设备;最后当设备准备好以后,调用唤醒函数sel_Wakeup来确定调用任务目前是否阻塞,这样可避免设备准备好而调用任务由于其它原因而挂起,或者调用selWakeupAIl()函数来唤醒所有等待该设备的任务。
|