- 论坛徽章:
- 0
|
回复 #5 T-Bagwell 的帖子
代码很长,那我就只把probe函数贴出来
static void ml505_dev_setup_cdev(struct cdev* dev,int index)
{
int err,devno = MKDEV(ml505_major,index);
cdev_init(&dev,&ml505_dev_fops);
dev->owner = THIS_MODULE;
dev->ops = &ml505_dev_fops;
err = cdev_add(dev,devno,1);
if(err)
{
printk("Error %d adding LED%d",err,index);
}
}
int ml505_dev_init (void)
{
int result ;
dev_t devno = MKDEV(ml505_major,0);
if(ml505_major)
{
result = register_chrdev_region(devno,1,"ml505_dev");
}
else //动态申请设备号
{
result = alloc_chrdev_region(&devno,0,1,"ml505_dev");
ml505_major = MAJOR(devno);
}
if(result<0)
return result;
ml505_cdev = cdev_alloc();
if(ml505_cdev == NULL)
{
result = -ENOMEM;
goto fail_malloc;
}
ml505_dev_setup_cdev(ml505_cdev,0);
init_MUTEX(&r_sem);
init_MUTEX(&w_sem);
init_MUTEX(&sem);
return 0;
fail_malloc: unregister_chrdev_region(devno,1);
return result;
}
static int __init ml505_probe(struct pci_dev *pci_dev,const struct pci_device_id *pci_id)
{
pdev = pci_dev;
pci_enable_device(pci_dev); //启动PCI设备
/*读取pci配置信息*/
iobase = pci_resource_start(pci_dev,0); //iobase为配置空间首地址
iobase_len = pci_resource_len(pci_dev,0); //配置空间的大小
request_mem_region((unsigned long)iobase,(unsigned long)iobase_len,"ml505_dev");
pci_set_master(pci_dev); //设置成总线DMA模式
pci_request_regions(pci_dev,(char *)THIS_MODULE); //申请IO资源
/*注册字符设备*/
ml505_dev_init();
phy_to_vir = (unsigned int *)ioremap((unsigned long)iobase,(unsigned long)iobase_len); //将PCI设备的寄存器空间映射为虚拟地址空间
return 0;
} |
|