zoukankan      html  css  js  c++  java
  • Android深度探索笔记-第七章

    尽管 Linux 驱动直接与硬件打交道,但并不是 Linux 驱动直接向硬件中的内存写数据, 而是与本机的 I/O内存(位于内核空间〉进行交互。每一个连接 Linux 的硬件在 I/O内存中都会有映射首地址。

    测试已有的led驱动时使用的adb shell命令或test leds.sh脚本文件,这里出现了base和dase两种脚本解析器,我之前接触过使用base的软件,在这里才知道是一种脚本解析器。

    这里使用了cdev函数族来创建设备文件,步骤如下:

    1:使用 cdev_init 函数初始化 cdev

    2:指定设备号,我们优先使用动态分配,使用alloc_ chrdev_region函数自动分配一个未使用的主设备号。如果直接指定设备号,需要使用registe_chrdey_region-函数注册字符设备区域。

    3:使用 cdev_add 函数将字符设备添加到内核中的字符设备数组中,在 cdev_add 函数中调用了kobj_map负责将设备文件的相关信息添加到保存已建立的设备文件的dprobes 数组中。

    4:使用class_create宏创建struct class,实际上使甩了class_create函数创建。

    5:使用 device create 函数创建设备文件device create(leds class, NULL, dev number, NULL, DEVICE NAME)。

    卸载 Linux 驱动的设备文件需要依次调用device_destroy,class_destroy,unreg ister_chrdev_region 方法。

    通过设置寄存器的值,我们可以控制led的状态和控制led的亮灭。控制led需要通过 3个寄存器来完成: GPMCON (端口配置寄存器),GPMDAT (端口数据寄存器)和 GPMPUD(端口上拉电路寄存器),每一个寄存器可以使用 4 个字节。上述3个寄存器在内存中都有一个虚拟地址,向这些地址写入数据后,arm处理器会使用一套算法将虚拟地址映射成物理地址,并根据物理地址将数据写入相应的硬件端口。

    使用前需要先完成寄存器的初始化,只要在leds_init函数中调用Jeds_init_gpm函数就可。

    驱动用2种方法控制led,通过字符串控制需要使用file_operations.write函数。如果通过I/0命令控制需要使用file_operations.iocd函数。

    使用module_param宏指定模块参数,通过module_param 宏可以指定参数文件的访问权限。

    通我们是过设置GPMDAT寄存器来控制led的亮灭的,所以如果要把说编写的代码在其他开发板上运行,就有根据具体的实际情况修改代码,直接编译很可能不能运行。

  • 相关阅读:
    背景图像固定(背景附着)
    css背景图片位置
    2.使用第三种方式做一个多线程操作 3. 使用线程池做一个1到100的偶数之和 4.写一遍生产者与消费者模式 5 写一个字符串的单例设置模式(未完成) 6. 写一个简单工厂着模式
    简单写写
    说说JSON和JSONP区别
    web前端常见的面试题,基础知识点
    优秀网页设计_优秀Web设计的69条设计原则
    PostCSS_自动处理css3属性前缀
    用lnmp架构部署wordpress网站详细步骤
    使用html+css+js实现简易计算器
  • 原文地址:https://www.cnblogs.com/bbly02/p/5653704.html
Copyright © 2011-2022 走看看