打印

字符驱动之一:基本框架

[复制链接]
189|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
香菇选手|  楼主 | 2018-8-22 09:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ev, hello, IO, vi, ST
1. 字符设备的基本的框架:1.1 组合主设备号和次设备号:设备号是一个 dev_t  的一个数,其实是一个32位的数

[cpp] view plain copy

print?<img id="aimg_tlDto"  class="zoom" width="12" height="12" file="https://code.csdn.net/assets/CODE_ico.png" border="0" alt="" /><img id="aimg_WpL14"  class="zoom" width="12" height="12" file="https://code.csdn.net/assets/ico_fork.svg" border="0" alt="" />



int hello_major = 250;  int hello_minor = 0;  dev_t dev = 0;  dev = MKDEV(hello_major, hello_minor);  





1.2 注册设备号:

注册上设备号后能用 lsmod 查看模块,一般是 xxx.ko 的 xxx

[cpp] view plain copy

print?<img id="aimg_TCSiQ"  class="zoom" width="12" height="12" file="https://code.csdn.net/assets/CODE_ico.png" border="0" alt="" /><img id="aimg_OFkgq"  class="zoom" width="12" height="12" file="https://code.csdn.net/assets/ico_fork.svg" border="0" alt="" />



int result;  int number_of_devices = 1;  result = register_chrdev_region(dev, number_of_devices, "hello_dev");  if(result < 0){      printk(KERN_WARING "hello: can't get major number %d\n", hello_major);      return result;  }  







1.3 取消注册的设备号:

[cpp] view plain copy

print?<img id="aimg_bf29g"  class="zoom" width="12" height="12" file="https://code.csdn.net/assets/CODE_ico.png" border="0" alt="" /><img id="aimg_dttHP"  class="zoom" width="12" height="12" file="https://code.csdn.net/assets/ico_fork.svg" border="0" alt="" />



dev_t devono = MKDEV(hello_major, hello_minor);  unregister_chrdev_region(devno, number_of_devices);  







2. 函数说明:MKDEV: --组合主设备号和次设备号,设备号的释放要晚于释放 cdev

    包含的库:

        linux/fs.h

    函数原型:(所在文件include/linux/kdev_t.h)

        #define MINORBITS 20

        #define MKDEV(ma.mi)    (((ma) << MINORBITS) | (mi))

    参数:

        ma,主设备号前 12 位

        mi,次设备号后 20 位

    返回值:

       设备号,类型是 dev_t ,一般的变量时 dev





register_chrdev_region: --静态注册设备号

    包含的库:

        linux/fs.h



    函数原型:

        int register_chrdev_region(dev_t from, unsigned count, const char *name)

    参数:

        from,设备号,240-254 是留给本地和实验用

        count,数量

        name,设备的名字,如果数量是多个,那名字应该放在一个数组里,这里就是是实现的(com1,com2,com3...)

            会显示在/proc/devices 中

    返回值:

        0,成功

        <0,出错





unregister_chrdev_region: --取消注册的设备号

    包含的库:

        linux/fs.h



    函数原型:

        void unregister_chrdev_region(dev_t from, unsigned count)

    参数:

        from,设备号

        count,数量





3. 两个结构体:file_operations: --字符设备操作的集合,包括很多函数的索引

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

450

主题

462

帖子

0

粉丝