电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

一个简单字符驱动

网上常见的一个linux字符驱动,见

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;

}

这样就方便多了

博主
cqcrr@163.com
面向大海 春暖花开
cqcrr
点击跳转