这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 关于编写vxworks pci驱动程序的问题

共10条 1/1 1 跳转至

关于编写vxworks pci驱动程序的问题

菜鸟
2007-05-31 16:14:02     打赏

我有两个问题想请教各位师兄:

1.能给我一个编写pci驱动程序的步骤吗?最好有一个模板,就是已经编写好的驱动程序。我想学习一下。

因为看了两天这方面的资料也不是很明白,如果能帮我一下,效果会好很多。

2.tornado下面的pci配置程序,是不是已经负责把pci找到了,换句话说:就是编译好的bsp是不是已经包含pci驱动了?而我所要编写的就是去某个端口取数据。是这个样子吗?

如果不是上面所述的话,那么bsp下的pci配置程序又是起什么作用的?

谢谢各位师兄!

此致!

敬礼




关键词: 关于     编写     vxworks     驱动程序     问题    

菜鸟
2007-05-31 21:36:00     打赏
2楼

啊,看看这样行不:

1. 用总线搜索的函数找到你的卡,并确定PCI PnP得来的各个IO/MEM基址和中断信息。

2. 按照板卡的寄存器定义编程,这个根本没有办法提供参考,每个PCI卡都不同。

可参考的资料有BSP目录下PCI网卡的PCI接口的网卡驱动,例如fei557。x86的稍微麻烦点,还要添加MMU条目。

PCI驱动是系统已经带有的,怎么说呢,严格来讲不叫PCI的设备驱动,应该是PCI总线驱动,因为它只提供访问PCI总线上相关资源的支持,而具体哪个设备如何驱动,则调用这些总线访问的支持函数自己做。如fei557、gei553或者其它任何PCI接口的设备驱动就是调用基本的PCI总线访问函数来做的。

俺这样理解:PCI,跟内存总线一样,它本身只是一种总线,一种途径。作为编写具体PCI设备的驱动来讲,就是利用这个途径来实现你设备的操作,就跟读写内存一样。。


菜鸟
2007-05-31 22:13:00     打赏
3楼

yaopg

这样的话,应该是编译好的BSP已经包含PCI总线驱动了,而我们所常说的编写“驱动程序”,无非就是调用BSP中提供的函数,去访问PCI接口,从里面读取或者发送给它数据。这样理解对吗?

那在tornado/target/src/drv有一些文件,其中包括“pci”是不是这里面的文件提供函数?

而且那个函数前面的类型"status"表示什么含义?在vxworks下编写c语言程序,应该遵循的语法手册是?

其中调用的函数库在哪里可以查到?

谢谢!


菜鸟
2007-05-31 23:39:00     打赏
4楼

可以这样理解的。

在BSP里面是要包含INCLUDE_PCI这个组件和其它相应配置,不过这些通常参考BSP里面就配置了的。

PCI总线使用了映射的概念,啥意思呢,就是把PCI总线上的东西跟普通存储或者IO总线上的东西在访问方式上保持一致,把PCI的IO\MEM空间映射到系统中来,感觉就好像在普通总线上一样。最终对编程来说,操作PCI总线上的MEM和IO和操作非PCI上的MEM和IO一样,地址编排、访问函数都一样的。我说清楚了没有?

啊x86的IO和MEM是独立编址的,有些CPU不是。VxWorks中访问IO端口的函数有sysOutByte/sysInByte等类似函数,MEM则可以通过指针或者直接内存读写来操作。

关于status的含义,你说的应该是STATUS吧。这些是基本的东西,在你开始做从事软件开发工作前,必须具备相关C预言的使用通行规则,这可能需要一些时间和积累。可以阅览相关的头文件和源文件,找到它的定义。--每一个非标准C预言数据类型都是有定义来源的,通常在头文件中。查找的话,可以在文件中搜索就可以得到。


菜鸟
2007-06-01 18:31:00     打赏
5楼
基本上明白了一些,不过最后的STATUS不太清楚,现在看来是因为没有看到头文件中声明的类型,主要是因为我从未在ansi c中看到这个STATUS类型。现在看来是对pci总线的操作,就是和mem统一编址进行操作,好像操作内存一样。不过驱动程序编写就是编写这样的程序?而最底层的硬件访问就不需要我们来做什么了?谢谢!

菜鸟
2007-06-04 21:04:00     打赏
6楼

STATUS在target/h/types/目录下的vxTypesOld.h文件里面定义的,为32位宽,从int类型来。

用MEM操作还是用IO操作,就看你的卡片的定义了。是否统一编址就看你的CPU类型了。

最底层的硬件访问?不就是读写寄存器吗?我们编写非PCI的驱动也是一样:)


菜鸟
2007-06-06 22:23:00     打赏
7楼

yaopg:

对于vxworks下的驱动程序,我还是不明白。我想问的是:最底层的操作硬件的代码是不是已经由windriver写好,并且编译在bsp中,我们编写的驱动程序只是操作某些函数即可?即:open(),read(),write()等函数。就可以实现所谓的“驱动程序”。而真正的操作硬件的那些汇编我们不用去写。是这个样子吗?还有就是我做了一个工控机上的板卡,要编写它的驱动程序,需要配置pci配置空间,请问师兄对该配置的详细说明,最好有一个实例,即:

配置什么数据,表示什么意思?

谢谢!

此致

敬礼


菜鸟
2007-06-07 01:41:00     打赏
8楼

这样理解不对。

BSP做好的事情只是能让你访问相应的硬件资源(啊,单就PCI驱动来说),离能使用操作系统IO系统函数还差很远--VxWorks并不知道你这是什么卡,只知道该如何操作PCI总线上的资源,因为有PCI标准。

举个例子吧:有一块卡:它使用三个PCIBAR,BAR0为MEM空间,BAR1,BAR2为IO空间。BSP做的事情是:

1. 通常会把这些空间映射到系统中来,可以让你象操作本地资源一样操作PCI上的资源,在x86中,这是由BIOS完成的,VxWorks仅仅接受其设置,在其它系统中,通常是BSP中的PCI支持库初始化过程中完成的。不管谁完成,这个过程通常叫做POST过程。POST过程很巧妙,写起来比较长,啊,网上自己找了看看。POST好之后,你用pciConfigTopoShow应该可以看到系统中所有的PCI设备的情况,然后用pciHeaderShow可以看某个设备的具体信息,里面就会包含有BAR的信息。比方说BAR1的值为0x10000000,那么使用硬件IO函数(注意:硬件IO和open()、read()一类的系统IO函数完全是两个概念),比如sysOutLong(0x10000000,0x5555aaaa)就可以向这个PCI的IO空间1输出一个0x5555aaaa的值。(要是内存空间则通过指针)。

2. 分配IRQ。因为PCI卡片自己只知道自己使用的哪根中断线,但不知道对应哪个IRQ,同样,POST软件会根据自己使用的母板的中断路由表来确定其对应的IRQ,并把这个值填写到PCI设备的寄存器里面去。中断路由表是跟母板(我们通常叫主板吧)有关的,好在IBM PC定义一套固定的规则,大家都按那个来做,我们通常就不用多考虑了。但是如果是非x86系统,这个中断路由表通常是在BSP中自己编写的。

啊,BSP就完成这么多,至于你的寄存器是啥含义啊什么的,就自己通过读写IO或者MEM寄存器来编程了,很简单,假如你的板子是一个串口卡,芯片是用的intel 8250,对应的IO空间BAR1,BAR1的基址是0x8400 0000,8位操作,你就可以像操纵普通的(不是位于PCI总线上的)8250一样操纵这个芯片了,甚至连访问函数都是一样的。

我说清楚了吗?


菜鸟
2007-06-08 22:23:00     打赏
9楼
现在看来好像明白了一些,也就是我们写驱动程序,实际上就是写“i/o”函数,对吧?写完这些I/O函数后,自己使用他们来编写应用程序对吧?

菜鸟
2007-06-09 01:20:00     打赏
10楼

可以这么说吧,但是驱动并不一定要写成IO函数形式的,也就是不一定要用open(),read(),write()这些函数,简单的设备其实用专用函数就比较好,对于嵌入式系统来说,也是个不错的选择。


共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]