evenaye
驱动牛犊
驱动牛犊
  • 注册日期2007-04-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分210分
  • 威望23点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
阅读:2002回复:4

偶的PCI卡驱动模板(请cyliu大侠帮忙看看)

楼主#
更多 发布于:2007-05-17 10:17
请各位侠客高手来看看,hoho
正在做一块PCI卡(用的是PLX9052),第一次写PCI驱动,看了网上给的驱动结构,没找到file_operations结构如何和设备联系起来的(在代码中应该就是一个注册的过程)
这个结构最初是在2.4下的,看了LDD3,发现2.6下也差不多,当然makefile和函数的具体实现什么的要变变
请大家给点建议(2.4下和2.6下是否都可行),毕竟是第一次写PCI驱动
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#include "test.h" //乱七八糟的包含定义等等都在这里了
//定义一下支持的设备
static struct pci_device_id __initdata test_pci_tbl[]= {
{VENDOR_ID, DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
{0,}
};
MODULE_DEVICE_TABLE(pci, test_pci_tbl);
// 对自己的PCI设备进行描述的数据结构
typedef struct{
struct pci_dev *pdev;
unsigned long int config_base;
unsigned long int wr_base;
unsigned long int wr_len;
unsigned int irq;
/*。。。。。*/
}test_card_info;
static test_card_info *my_test=NULL;

//接下来是一堆的函数声明
/*..............................*/

static struct pci_driver test_pci_driver = {
name: MODULE_NAME
id_table:test_pci_tbl,
probe: test_probe,
remove:__devexit_p(test_remove)
};


static struct file_operations test_fops = {
owner:THIS_MODULE,
read:test_read,
write:test_write,
ioctl:test_ioctl,
open:test_open,
release:test_release
/*..................*/
};

static struct miscdevice test_miscdev=
{
TEST_MINOR,
"mytestcard",
&test_fops  //这里算是把设备方法和设备初步关联的过程吧
};

//接下来是函数的实现部分啦
//在probe中对test_card_info结构体初始化,还要实现misc_register (&test_miscdev),这个算是把设备的方法和设备真正关联起来了吧

//open要实现request_irq等等
/*..............................................*/

//最后是几个千篇一律的东西
static int __init test_init (void)
{
return pci_register_driver(&test_pci_driver);
}

static void __exit test_cleanup (void)
{
pci_unregister_driver(&test_pci_driver);
}

// 加载驱动程序模块入口
module_init(test_init);

// 卸载驱动程序模块入口
module_exit(test_cleanup);

最新喜欢:

LeopardLeopar...
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
沙发#
发布于:2007-05-17 16:00
厉害,努力。测试一下,一切了然。呵呵,-:)
走走看看开源好 Solaris vs Linux
evenaye
驱动牛犊
驱动牛犊
  • 注册日期2007-04-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分210分
  • 威望23点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-05-17 16:48
感谢cyliu大侠
不过碰到新问题了,惭愧的说
卡插在机子上后,开机,进虚拟机,找不到卡
insmod 模块后果真没卡。。。
看/proc下也没有,不过windows下发现了
不知道这个问题怎么解决,PCI发现的过程是在BIOS里完成的,难道要装个Linux?
希望能帮忙确认一下问题发生在什么地方,是驱动代码还是其他地方
再次感谢!
evenaye
驱动牛犊
驱动牛犊
  • 注册日期2007-04-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分210分
  • 威望23点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-05-18 16:17
Vmware的问题,在做个系统了。。。
偶又发现新的问题了...
如果驱动需要支持多块卡(卡都一样,通过跳线设置不同的卡ID)
驱动应该怎么做?
偶的想法:
static struct pci_device_id __initdata test_pci_tbl[]= {
    {PCI_VENDOR_ID, DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
    {0,}
}; 这个结构的成员还是只有一个,靠卡ID来识别不同的卡
驱动维护一个链表,每个结点代表一个设备,链表的初始化和结点的添加在probe里完成,但是中断什么的该怎么办?(中断申请一个中断?来中断了怎么判定是哪一块卡的?难道要遍历一遍链表?)
open、close呢?难道要为每块卡建个设备文件?比如有3块卡,建立设备文件的时候难道要mknod /dev/test c 10 8
        mknod /dev/test c 10 9
       mknod /dev/test c 10 10    (具体设备号请别介意,例子而已)
请高手特别是cyliu大侠指点啊
//bow
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
地下室#
发布于:2007-05-22 12:11
中断通过设备号来区分阿。你不是保留了Id了吗?可以把id等私有信息保存在设备的私有空间中。

设备文件是对应用层的接口,应该是每个设备对应一个。
走走看看开源好 Solaris vs Linux
游客

返回顶部