qnx 4.25设备驱动程序的编写

qnx 4.25设备驱动程序的编写

ID:25051634

大小:49.00 KB

页数:4页

时间:2018-11-18

qnx 4.25设备驱动程序的编写_第1页
qnx 4.25设备驱动程序的编写_第2页
qnx 4.25设备驱动程序的编写_第3页
qnx 4.25设备驱动程序的编写_第4页
资源描述:

《qnx 4.25设备驱动程序的编写》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、QNX4.25设备驱动程序的编写摘要:介绍实时操作系统QNX4.25下编写设备驱动程序的大体框架、底层细节以及诸多注意点。针对使用较为普遍的PCI设备作为较为详细的描述。关键词:驱动程序QNX实时操作系统PCI引言QNX是一个多任务、多用户、分布式、可嵌入式符合POSIX标准的微内核的主流实时操作系统,广泛用于实时性能、开发灵活性、网络灵活性要求较高的场合,如电信系统、医疗仪器、航空航天、工业自动化、交通运输、POS机、信息家电等。QNX是一个适合软件/硬件定制的实时操作系统。如果你曾经试图在传统的UNIX或an.h>#include

2、<sys/osinfo.h>#include<sys/pci.h>#include<i86.h>#defineYOUR_PCI_DEVICE_ID0x1713//根据具体设备提供对应的厂商标识及设备标识#defineYOUR_PCI_VENDOR_ID0x13feintmain(void){unsignedbusnum,devfunum;//总线号(PC仅有一条)及设备功能号longaddress;longio_base;//I/O基地址unsignedcharirq;//中断号intpci_index=

3、0//标识为零标识第一块此种型号设备if(_CA_PCI_Find_Device(YOUR_PCI_DEVICE_ID,YOUR_PCI_VENDOR_ID,pci_index,busnum,devfunum)!=PCI_SUCCESS){printf("Cannotfinddevice");exit(EXIT_FAILURE);}//侦测设备中断if(_CA_PCI_Read_Config_Byte(busnum,devfunum,offsetof(struct_pci_config_regs,Interrupt_Line),1,irq)

4、!=PCI_SUCCESS){printf("Errorreadinginterrupt");exit(EXIT_FAILURE);}//侦测设备I/O基地址if_CA_PCI_Read_Config_D,devfunum,offsetof(struct_pci_config_regs,Base_[2]),1,(char*)address)!=PCI_SUCCESS){printf("Errorreadingaddress");exit(EXIT_FAILURE);}io_base=PCI_IO_ADDR(adress);printf("I

5、Oaddress:%x",io_base);printf("IRQ:"%x",irq);exit(EXIT_SUCCESS);}注意:各种设备的Base_Address_Regs[x],x可能不尽相同,需要查看具体的硬件手册决定。2进入硬件一旦获得了系统分配给某个硬件设备的资源信息,就可以同这个设备进行通信了。至于如何做取决于需要访问的硬件资源。2.1I/O资源一个进程试图进行I/O操作,必须具有正确的权限等级。你必须是超及用户(root),在编译的时候加上适当参数T1,以确何该进程拥有访问I/O口的权限。若忽视这一点,该运行进程将获得一个

6、口的权限。若忽视这一点,该运行进行将获得一个SIGSEGV信号,表示一个非法的内存引用,并结束进程运行。现在就可以利用inp()、inpd()、inpp;~0x80);2.2存储映射资源某些设备,可以通过一般的内存操作进入寄存器,这就需要获得内存基地址(memorybaseaddress)。为了能够获进入此类设备的寄存器,需要将其映射到驱动程序虚拟地址空间。QNX下的技术资料/etc/readme/technotes/shmem.txt描述了如何创建一个共享内存对象,然后将这个内存对象的一段内存映射到PCI卡中,以便能够进入这个PCI设备。

7、(接着上面的代码)可以利用mmap():char*mem_base;if(PCI_IS_MEM(address)){//判断内存基地址intfd;char*page_ptr;fd=shm_open("Physical",O_RDAP_SHARED,fd,PCI_MEM_ADDR(address)~0xfff);//将内存基地址映射if(page_ptr==(char*)perror("Errormmap:");exit(EXIT_FAILURE);}mem_base=page_ptr+(PCI_MEM_ADDR(address)0xfff)

8、;close(fd);}printf("MEM"address:%lx",PCI_MEM_ADDR(address));if(PCI_IS_MEM(address))printf

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。