关于字符设备的注册,标准的2.6中可以这样做:
static struct cdev dev;
static int wmsc_dev_init(void)
{
int ret;
dev_id = MKDEV(DEV_MAJOR,0);
ret = register_chrdev_region(dev_id,1,DEV_NAME);
if(ret < 0){
printk(KERN_ERR"Can't register device,maybe the device id has been used.\n");
unregister_chrdev_region(dev_id,1);
return ret;
}
cdev_init(&dev,&fops);
ret = cdev_add(&dev,dev_id,1);
if(ret < 0){
printk(KERN_ERR"Can't add device.\n");
cdev_del(&dev);
return ret;
}
return 0;
}
#define DEV_MAJOR 178
#define DEV_NAME "gpio"
static struct file_operations fops = {
.open = wmrc_open,
.read = wmrc_read,
.write = wmrc_write,
.ioctl = wmrc_ioctl,
.owner = THIS_MODULE,
};
后面就是些设备加载,和节点创建等,如下:
insmod xx.ko
mknod /dev/gpio c 177 0
chmod 766 /dev/gpio
这些流程是挺正确的,也有固定的流程,不用深归内部的原理,制作驱动还是要深入的算法里面的。