9030PCI CAN驱动开发点滴

1.配置EEPROM. 使用PlxMon打开9030,基本修改Spacex(0,1,2,3), Chip selectx(0,1,2,3), 中断状态INTCSR(0x74), 其他(0x78),详细说明一下。

(1)Spacex、Chip Selectx

首先明确使用哪几个本地地址空间(9030本地端几个RAM?硬件连接几根CS信号线?),例如硬件将CS0信号连接RAM1,CS2信号连接RAM2,那么你需要配置Space0和Space2. 4个Space的配置方法一样,看你需要哪个就配置哪个,不需要的禁用之。

举例:我的硬件CS0挂了一片16KB的RAM1,本地总线8数据位宽,CS1挂了4K的RAM2,数据读写采用突发模式(burst mode)。

Descriptor0(0x50): 0x00002081, 置bit[0]指示内存映射,任意32bit PCI空间,置Enable prefecth(跟速度有点关系,不过实际没感觉出来),其余的不管。

Range0(0x28):0xFFFFC000, 16KB. PCI memory. memory的效率和速度要比IO快。

Remap0(0x3C):0x00000001, 置bit[0],启用Space0.

CS0 Bace(0x64):0x00002001, 16Kb(为什么不是0x4000,看9030db), Bace,0x000000

Descriptor1(0x54): 0x00002081, 置bit[0]指示内存映射,任意32bit PCI空间,置Enable prefecth(跟速度有点关系,不过实际没感觉出来),其余的不管。

Range1(0x2C):0xFFFFF000, 4KB. PCI memory. memory的效率和速度要比IO快。

Remap1(0x40):0x00000001, 置bit[0],启用Space0.

CS1 Bace(0x68):0x00004801, 4Kb, Bace,0x004000(CS0已经将0x4000一下占用)。

(2)INTCSR(0x74)

使能Lint1,使能PCI中断。

(3)其他(0x78),可选,可不配置。这里可以配置PCI操作配置空间的IO/MEM资源诉求,这样在PCI设备枚举阶段,系统就会分配响应的资源。例如你选择IO和MEM,那么就分配了2种操作配置寄存器的地址段。

2.inf文件,前几篇文章中已经对这部分学习过。

3.编写驱动及功能接口

(1)选择实现方案

有2种方案:a.是plx官方的sys文件,使用plx SDK提供的API再次封装我们的功能接口;b.Driver Studio+DDK的开发策略。

我一开始就选择了a方案,不过b方案也可行,只是b方案需要理解一下DriverWorks生成的代码框架,注意处理windows内核开发的关键点。

(2)a方案

看SDK下的Samples,重点理解设备打开函数、内存映射函数、中断使用。这几个函数理解明白后,可以写自己的应用层程序,读写硬件。

(3)b方案

需要明白几个事情后,再写代码。

i.应用程序CreateFile、WriteFile、ReadFile、CloseHandle时,分别调用哪些IRP分派函数?

ii.应用程序怎么向CreateFile传设备连接符参数?如果是多个设备呢?

iii.isr,isr_DPC是怎么回事?运行在什么IRQL上?

iv.分页内存和非分页内存区别,哪一种堆可以用在较高级别的IRQL上,为什么?

v.系统上电后,怎么给PCI设备分配资源(地址资源、中断资源),在驱动中怎么读写寄存器,读写pci本地RAM空间?

vi.中断后怎么处理,缓存数据(FIFO)?给应用程序发信号?DPC具体怎么处理?

vii.调试查看驱动程序执行信息,简单点的工具是driver monitor, 打印。

如果这些问题,在心中已经较明确,那么就开始准备动手吧。我先罗列出这些问题,日后一点点回答。

4.写代码的思维方式

写代码之前,把关键点想明白。写代码的过程,需要你集中精力和细节细心,认真思考,尽量早的避免明显的漏洞,Debug是件态痛苦的事情了。写代码不是写散文,更不是聊天,而是思考。

在处理有逻辑顺序的模块时,一定要记着使用状态机的思想,这样能让你的思路清晰。不过,写完状态机后,要认真的多捋几遍,这里是最容易出问题的地方。

5.克服一个个的技术难题

在你解决技术问题时,记着今天解决的事情,不要明天就忘记啦。总结你犯过错误和走过的误区,才是你做这件事本身对你的收获。

原文地址:https://www.cnblogs.com/yuqiao-ray-vision/p/3661083.html