网上常见的一个linux字符驱动,见
http://www.dzsc.com/data/html/2009-5-31/76528.html
insmod test.ko
lsmod 就可以看到test在列表中
gedit /proc/devices 可以看到系统为test分配的主设备号
mknod /dev/test c major minor major 即时系统为test分配的主设备号,minor为0即可
这个例子应该是比较早的,所以在2.6的Linux下直接编译会有一些错误。需要修改一些地方,添加Makefile文件。而且 编译过后还需要人工mknod,很麻烦,还是使用动态注册方式比较方便,在源文件的开始定义
struct cdev test_dev;
……
把初始化函数更改如下:
static int init_my_module(void)
{
dev_t dev; // dev_t实质是32位无符合数,用来保存设备编号,包括主设备号和次设备号
int ret,devno;
unsigned int major_num;
ret=alloc_chrdev_region(&dev,0,1,"test"); // 动态注册设备,由系统分配一个主设备号,值赋给dev
major_num=MAJOR(dev); // 获得主设备号,此号码由系统动态分配
devno=MKDEV(major_num,0); // 参数0表示次设备号为0,使用MKDEV宏由系统分配的主设备号和自己指定的次设备号得到一个新的dev_t数据
cdev_init(&test_dev,&test_fops); // a323_dev和fops连接
//test_dev.owner= THIS.MODULE;
test_dev.ops = &test_fops;
ret=cdev_add(&test_dev,devno,1); // 将设备加入到系统中
if(ret){
unregister_chrdev_region(dev,1);
printk("error add device");
return ret;
}
printk("mknod c /dev/%s %d 0\n","test_device",major_num);
return 0;
}
这样就方便多了
文章评论(0条评论)
登录后参与讨论