LED驱动程序--可拓展的LED驱动程序

简介: LED驱动程序--可拓展的LED驱动程序

LED驱动程序–可拓展的LED驱动程序

一.把驱动拆分成通用的框架(leddrv.c),具体的硬件操作(board_X.c)

实现一个通用的框架leddrv.c和 具体的硬件操作。想要操作那个硬件就将相应的框架和硬件操作一起编译成对应的驱动程序。


二.以面向对象的思想,改进代码

抽象出一个结构体:

struct led_operations{
  int (*init) (int which);//初始化LED,which-哪个LED
  int (*ctl) (int which,int status);//控制LED,which 哪个LED,status;1-亮,0-灭
}

每个单板相关的board.c实现自己的led_operations结构体,供上层的leddrv.c调用

有四个文件,led_opr.h定义单板结构体,board_demo.c定义一个实实在在的单板,并且写传递这个单板的指针将用于leddrv.c,用于控制LED,其实就是在单板的控制函树套上一个外框满足read,open,write,close,等函数的外框。


三.怎么写LED驱动程序

详细步骤如下:

1.看原理图确定引脚,确定引脚输出什么点平才能点亮/熄灭LED

2.看芯片手册,确定寄存器操作方法;哪些寄存器?哪些位?地址是?

3.编写驱动程序:先写框架再写硬件操作的代码

注意:在芯片手册中去定的寄存器地址被称为物理地址,在Linux内核中无法直接使用。需要使用内核提供的ioremap函数把物理地址映射为虚拟地址,使用虚拟地址。

ioremap函数的使用:

1.函数原型:

void __iomem *ioremap(resource_size_t res_cookie,size_t size)

使用时,要包含头文件

#include<asm/io.h>

2.它的作用:

把物理地址phys_addr 开始的一段空间(大小为size),映射为虚拟地址;返回值是该段虚拟地址的首地址。

virt_addr = ioremap(puys_addr,size);

实际上,它是按页(4096字节)进行映射的,是整页整页地映射的。

假设phys_addr = ox10002,size = 4,ioremap 的内部实现是:

a.phys_addr按页取整,得到地址ox10000

b.size按页取整,得到4096

c.把起始地址0x10000,大小为4096的这一块物理地址空间,映射到虚拟地址空间,假设的得到的虚拟空间起始地址

为0xf001002

3.不再使用该段虚拟地址时,要iounmap(virt_addr);

void iounmap(volatile void __iomem * cookie)


目录
相关文章
|
算法 网络协议 物联网
|
机器学习/深度学习 算法 Python
使用Python实现简单的线性回归模型
【10月更文挑战第2天】使用Python实现简单的线性回归模型
324 1
|
存储 负载均衡 Dubbo
Dubbo阶段性总结及3.0新特性
该文章是对Dubbo技术的一次总结,包括对Dubbo框架的整体架构、服务提供者发布注册原理、SPI机制、服务消费者订阅原理、服务调用原理、线程池模型、负载均衡机制、服务容错机制等内容的回顾,并简要介绍了Dubbo 3.0的新特性。
Dubbo阶段性总结及3.0新特性
|
前端开发 小程序 JavaScript
面试官:px、em、rem、vw、rpx 之间有什么区别?
面试官:px、em、rem、vw、rpx 之间有什么区别?
519 0
|
算法 异构计算
推测解码:在不降低准确性的情况下将LLM推理速度提高2 - 3倍
在本篇文章我们将详细讨论推测解码,这是一种可以将LLM推理速度提高约2 - 3倍而不降低任何准确性的方法。我们还将会介绍推测解码代码实现,并看看它与原始transformer 实现相比到底能快多少。
914 10
|
监控 数据可视化 数据挖掘
ERP系统中的销售预测与市场分析
【7月更文挑战第25天】 ERP系统中的销售预测与市场分析
897 2
|
弹性计算 缓存 监控
云效将项目代码部署到云服务器ECS
云效支持一键和手动部署,一键部署因其高效、一致性和可重复性而受青睐,但也存在灵活性不足和初期设置复杂的挑战。优化方向包括简化脚本、提供选项、完善文档、集成监控和回滚机制。一键部署步骤概括为:准备云效项目和ECS,配置项目和环境,编写部署脚本,设置一键部署,测试脚本,审核发布,监控结果,及后续维护。实际操作应参照云效最新文档。
|
JavaScript 小程序
微信小程序-页面访问组件数据和方法
好了,结构搭建的差不多了,接下来就是来看关键的内容了,首先我们来看一下如何拿到一个自定义组件的实例,有两种方式,这两种方式的前提条件是,给这个组件设置一个标识,设置标识的方式可以是通过类名或者ID进行设置,然后通过这个标识得到组件实例。
653 0
|
安全 Java Nacos
『MSE』阿里云中“间”力量MSE-Nacos
注册配置中心 MSE-Nacos (以下简称 MSE-Nacos),即 Nacos 的企业版,开箱即用的 Nacos 云服务,对 Nacos 内核进行企业级稳定性加固,故障自动检测及恢复、多可用区容灾、推空保护等特性,具有风险管理能力,全局持续分析并管理集群风险;企业级安全基于 RAM 鉴权体系,可构建细粒度的安全控制能力,集成阿里云 KMS 提供配置加密能力,帮企业更安全地使用 Nacos 服务
64704 10
『MSE』阿里云中“间”力量MSE-Nacos
|
编解码 算法 数据格式
【经典蓝牙】蓝牙 A2DP协议分析
A2DP(Advanced Audio Distribution Profile)是蓝牙高音质音频传输协议, 用于传输单声道, 双声道音乐(一般在 A2DP 中用于 stereo 双声道) , 典型应用为蓝牙耳机。         A2DP旨在通过蓝牙连接传输高质量的立体声音频流。它使用的基本压缩算法是SBC(Sub-Band Coding)来减小音频数据的大小,同时保持高音质,SBC压缩虽然效率较低,但是是必须支持的基本备用方案。A2DP还支持其他高级编解码器,例如AAC、aptX和LDAC,这些编解码器比SBC提供更好的音质,但这些编解码器的支持取决于设备本身的支持情况。
5034 0
【经典蓝牙】蓝牙 A2DP协议分析