红联Linux门户
Linux帮助

linux的PCI驱动编译警告

发布时间:2011-01-12 16:47:35来源:红联作者:wucongdonglai
[i=s] 本帖最后由 wucongdonglai 于 2011-1-13 08:46 编辑 [/i]

看了一阵子linux驱动的相关知识,今天打算自己写一个大体框架,然后在往里慢慢填充!结果问题一大堆,而且都莫名其妙!
我用的内核版本是2.6.15.5,系统的fedora 7,编译命令都相当于
make -C /usr/src/linux-2.6.15.5 M=(shell pwd) modules

我是照着linux设备驱动程序里的pci例子写的:源码如下:
#include
#include
#include
#include
#include

static struct pci_device_id ids[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3), },
{ 0, }
};
MODULE_DEVICE_TABLE(pci, ids);
static unsigned char skel_get_revision(struct pci_dev *dev)
{
u8 revision;
pci_read_config_byte(dev, PCI_REVISION_ID, &revision);
return revision;
}
static int probe(struct pci_dev *dev, const struct pci_device_id *id)
{
/* Do probing type stuff here.
* Like calling request_region();
*/
pci_enable_device(dev);

if (skel_get_revision(dev) == 0x42)
return -ENODEV;

return 0;
}
static void remove(struct pci_dev *dev)
{
/* clean up any allocated resources and stuff here.
* like call release_region();
*/
}
static struct pci_driver pci_driver = {
.name = "pci_skel",
.id_table = ids,
.probe = probe,
.remove = remove,
};
static int __init pci_skel_init(void)
{
return pci_register_driver(&pci_driver);
}
static void __exit pci_skel_exit(void)
{
pci_unregister_driver(&pci_driver);
}
MODULE_LICENSE("GPL");
module_init(pci_skel_init);
module_exit(pci_skel_exit);

运行编译,一点问题都没有,没有任何错误和警告就完成了!
但是我的和它基本一样,错误很多:
错误1:
我的源码如下:
79 #define ADLINK_VENDOR_ID 0x1022
80 #define ADLINK_DEVICE_ID 0x2000
81
82
83 static struct pci_device_id adl_pci_tbl [] = {
84 {ADLINK_VENDOR_ID,ADLINK_DEVICE_ID,PCI_ANY_ID,PCI_ANY_ID,0,0,0},
85 // {0x1022,0x2000,PCI_ANY_ID,PCI_ANY_ID,0,0,0},
86 {0,}
87 };
88 MODULE_DEVICCE_TABLE(pci,adl_pci_tbl);
它就显示错误:
/home/gm/tmp/adl/adlink.c:89: 警告:数据定义时没有类型或存储类
/home/gm/tmp/adl/adlink.c:89: 警告:在 ‘MODULE_DEVICCE_TABLE’ 的声明中,类型默认为 ‘int’
/home/gm/tmp/adl/adlink.c:89: 警告:函数声明中出现形参名却未指定类型
这3个警告,我把例子程序的源码段改为
static struct pci_device_id ids[] = {
// { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3), },
{ 0x8086,0x262f,PCI_ANY_ID,PCI_ANY_ID,0,0,0},
{ 0, }
};
然后编译,也照样通过啊,为什么我的就是不行呢?会有那后面3个警告呢?想不明白
错误2:源码如下:
131 static struct file_operations adl_fops={
132 owner: THIS_MODULE,
133 read: adl_read,
134 write: adl_write,
135 open: adl_open,
136 ioctl: adl_ioctl,
137 release: adl_release,
138 };
……
157 static struct pci_driver adl_pci_driver= {
158 .name = MODULE_NAME,
159 .id_table = adl_pci_tbl,
160 .probe = adl_probe,
161 .remove = adl_remove,
162 };

/home/gm/tmp/adl/adlink.c:133: 警告:从不兼容的指针类型初始化
/home/gm/tmp/adl/adlink.c:134: 警告:从不兼容的指针类型初始化
/home/gm/tmp/adl/adlink.c:136: 警告:从不兼容的指针类型初始化
/home/gm/tmp/adl/adlink.c:137: 警告:从不兼容的指针类型初始化
/home/gm/tmp/adl/adlink.c:161: 警告:从不兼容的指针类型初始化
我故意采用2种方式定义,但是好像都有这个警告,但是不明白为什么有的就有警告,有的就没有警告!纳闷啊!但是例子程序就好好的啊!搞不明白,都是在我同一台电脑上啊!哪位大大帮忙看看啊!
文章评论

共有 3 条评论

  1. aifly 于 2011-02-09 16:05:22发表:

    学习中.........

  2. wucongdonglai 于 2011-01-13 16:38:11发表:

    4# shenhao0129
    的确,直接从这上面入手,很多背后的实现都隐藏了,也不知道是如何实现的,只会依样画葫芦,其实没有学到多少东西

  3. wucongdonglai 于 2011-01-13 08:45:36发表:

    [i=s] 本帖最后由 wucongdonglai 于 2011-1-13 08:47 编辑 [/i]

    2# shenhao0129
    也就刚接触,还真别说,看网上的说法,PCI驱动要比别的驱动好搞很多,很多东西都已经做好了,只需要你用就行了!错误一大堆啊,头大如斗啊