关于驱动模块分离概念

驱动程序的分离其实就是把原来我们写的驱动程序进行分割,分割成为一个是基本不变的与硬件相关的drv程序和纯软件的dev程序。设备(dev),驱动(drv)两个模块分别编写驱动程序,在设备的.C文件中,负责定义驱动的设备IO地址等可变的信息,而在驱动的.C文件中负责统一的内存地址IOREMAP映射,注册设备等不变的代码。这样,当我们程序要修改时,比如说如果我们要将beep修改为led的话,那么就只需要将设备的.C文件中的地址修改过来就可以了,大大的增强了代码的可移植性。它的框图是这样的: 

                         App
--------------------------------------------------
                 input.c
--------------------------------------------------
           /                  \
          /                    \
         /        分离           \
button.c       < ===== >   evdev.c
硬件相关                    纯软件(稳定)

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

bus_drv_dev模型                             bus  drv链表    
1.device放入busdev链表      device_add  /.match\ 1.放入drv链表 2.dv链表取出一一比较(match
2.busdrv链表取出每一个drv              /         \driver_register 
busmatch函数判断drv能否支持dev        /           \3.若支持,调用probe
3.若可以支持,调用drvprobe           device       driver
                                    硬件相关      .probe比较稳定的代码
                                                 .name


-----------------------------------------------
                 usb_bus_type
                /            \
usb_new_device /              \usb_register
              /                \
usb_interface                  usb_driver
                               .id_table
                               .probe
                                                    
-----------------------------------------------
        platform_bus_type
      /       .match  \
     /                   \
    /             \
platform_device         platform_driver
                        .probe

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

一、 设备Led_dev.c的实现

1.定义平台设备结构体

关于驱动模块分离概念

如图所示,在平台设备结构体,需要注意两个地方: 

第一个是.name,它是用于保存在设备链中,利用它在驱动链中进行匹配,找到相应的驱动程序。

 

第二个是.resources,它是一个资源结构体,用于保存我们开发板的内存IO地址,当我们要更改硬件是,只需要修改资源结构体中的数据即可。简单的说,资源结构体主要的功能就是传递参数,将板子的内存地址传入Led_drv.c中,Led_drv.c只要通过platform_get_resource函数即可得到资源中保存的数据。

2.定义资源结构体

Led_drv.c将这些数据获取,然后分别ioremap进行地址映射

关于驱动模块分离概念

3.接下来就是在分别在入口函数中申请平台设备,在出口函数中注销平台设备

关于驱动模块分离概念

4.注意:添加led_release()函数

没有添加led_release()函数时,会出现问题,需要定义一个led_release()函数,里面什么也不做

关于驱动模块分离概念

 

二、 驱动Led_drv.c的实现

    1.平台驱动支持

和上面差不多,此处我们先实现一个平台驱动的支持,也就是

①定义平台驱动结构体

②在入口函数中注册平台驱动

③在出口函数中卸载平台驱动

此处就不再详细将这个,见下图:

关于驱动模块分离概念

2.平台驱动探测函数probe实现

我们此处驱动程序的核心就是在probe这个函数。

当我们的驱动和设备匹配成功之后,就会调用probe函数,在此函数中可以干任何我们想干的事。

所以,我们呢,就利用此函数完成我们的硬件设备初始化的工作。

  到前面设备Led_dev.c文件中的资源结构体的资源

②将前面的资源中的地址,通过ioremap函数分别映射地址

③注册字符设备驱动,创建类,然后再类下面创建设备节点

如下图所示:

关于驱动模块分离概念

3.平台驱动释放函数remove实现

remove函数中,自然就是将前面我们映射的地址取消映射,卸载字符设备驱动程序

如图所示:

关于驱动模块分离概念

4.实现file_opration结构体

前面注册字符设备时,

关于驱动模块分离概念

需要一个file_operation结构体,用于制定读写函数,如下图所示:

关于驱动模块分离概念

5.实现打开函数led_open

  前面,我们的probe函数中已经实现了IO地址的映射,以及设备号的自动申请,自动创建设备节点。但是,单独只有这些是还不够的,要想实现特定的功能,必须还得对IO引脚进行配置,所以,我们此处,在打开函数中实现引脚的配置。如下图所示:

关于驱动模块分离概念

6.实现写函数led_write

通过前面的额正确配置GPIO,我们就已经可以正确的使用led了,接下来,我们通过写函数来将我们的数据传入内核,从而相应的led灯的亮和灭。

关于驱动模块分离概念

三 、应用程序led_test.c的实现

在测试程序中,我们只需要实现以下几步

①打开设备

②判断用户输入的命令

③根据用户的命令来相应的控制

 

当我们用户输入

./led_test on         led灯亮

./led_test off        led灯灭

关于驱动模块分离概念

四 、测试程序

 

 

关于驱动模块分离概念

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为实现用户需求,从需求分析阶段的数据流图出发,根据小组讨论后确定的最佳方案。本系统主要包括两大功能模块:学生信息和成绩信息两个系统。其中学生信息系统划分为七个模块,学生成绩划分为四个模块。然后在需求分析阶段所确定的系统数据需求的基础上,进一步设计数据结构。在测试过程中,先对单个模块进行测试,然后把模块连接起来进行测试。测试完成后书写文档,最后小组成员和用户在一块审查和复审。 1、 课题陈述 一方面,在时下这个飞速发展的信息社会中,直到今天仍然没有一套完善可行的学生信息管理系统出现在学校里。每年,从大专生、本科生到硕士生、博士生,几千人的入学、升学、毕业,全要由教务处和各系老师人工管理。信息量之巨大,工作量之繁重,是难以想象的。因此,学校和各个系都要安排多名教师专门负责学生学籍管理,浪费了大量的人力资源。然而,即使这样,管理仍然谈不上井井有条。举一个最简单的真实例子,一个同学的姓名在花名册里印错了,就一错错了三年,一直没能改正。同学想去改,却不知道是应该找系里,还是去找教务处。还有,当学生的基本信息,比如家庭住址、电话等变更后,无法及时在档案中修改,使得老师与同学无法联系沟通。 另一方面,从社会这方面讲,随着计算机的普及,越来越多的学校利用计算机来处理日常事务。面对众多的数据资料,很多管理者常常感到无从下手。在数字化的今天,我们需要一个学生管理系统,使我们的整体管理水平上一个档次,与如今这个高科技的信息社会接轨。 因此,如何有效的管理学生信息,帮助学校和老师管理和掌握这些情况,这就是学生信息管理系统需要完成的任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值