字符设备驱动有关(一)

一直在看,但是很是晦涩难懂啊。从网上查了很多。现在写下帮自己理清思路。


一、先理解一些关系

1、如果应用程序想控制硬件,是要通过库函数、内核、和驱动才能达到目的。

                                 |---------------------------------------|

        应用------------|库函数---------内核---------------驱动|-------------硬件

                               |---------------------------------------|

2、应用程序怎么来控制硬件呢?

     是通过控制设备文件,设备文件就是将硬件等效为文件,从而将对硬件的操作当做对文件的操作,用open,fopen等


       应用---------------------------------------设备文件


       怎么创建设备文件呢?以便于应用来访问。(这里虽然创建了,但这个设备文件还没有和硬件关联起来,还需要驱动来实现,这步一般放到最后做)

       方法就是:

       a、手动创建mknod命令,也可以写脚本。  

       b、动态创建:在驱动编程时创建

           首先创建一个类:class_create()

              然后根据这个类创建节点:device_create()

3、那驱动作用是将设备文件和硬件关联起来。

         |----------------------------------------|      <------------>

       | 内核------------驱动 --------------硬件|      <------------>        设备文件

       |----------------------------------------|      <------------>

      关联的方法:

      a、分配设备号:

          *自动:int alloc_chrdev_region()

             *手动:register_chrdev_region()

      b、将字符设备注册到内核中:

             *动态内存初始化:cdev_alloc(),cdev.ops = &fops;cdev.owner =THIS_MODULE

             *静态初始化cdev:cdev_init() ,  cdev.owner = THIS_MODULE

              然后添加到内核中:cdev_add()

-------------------------------------------------------------------------------------------------

以上框架就做好了。当然功能open,read等还没实现。

而且更重要的是理论知道了,但是程序该怎么写啊。

先说上述的该怎么转换成程序


二、将上述所说转化为程序

1、驱动程序加载

int __init testchar_init(void)(参考helloworld模块)
{

        a、alloc_chrdev_region() //动态分配主次设备号

        b、cdev_alloc()               //cdev分配空间              

        c、cdev_init()                 //cdev初始化

        d、cdev.owner = THIS_MODULE

        e、cdev_add()               //添加到内核

        f、class_create()          //动态设备文件的创建

        g、device_create()

}
module_init(testchar_init);

2、驱动程序卸载

void __exit testchar _cleanup(void)
{
        a、unregister_chrdev_region();//取消设备号
        b、class_device_destroy();      //取消动态设备文件的创建
        c、class_destroy();
        d、cdev_del();                        //从内核中取消注册
}
module_exit(testchar_cleanup);

------------------------------------------------------------------------------------------

以上程序就是主要的模块添加与卸载的程序,和helloword模块是一样的,不过还程序还不完善,下面来完善open,read等功能


三、一些数据结构

主要这三种:file_operations数据结构,file数据结构 和 inode数据结构.

1、file_operations数据结构:(其实内容还有很多,但基本只用到了下面几个)

structfile_operations test_fops = 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值