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)


目录
相关文章
|
4月前
|
Unix Linux 编译器
Linux驱动设计(一):驱动是什么?
Linux驱动设计(一):驱动是什么?
48 0
单片机外围模块漫谈之五,USB开发,这个错误你犯了吗?
单片机外围模块漫谈之五,USB开发,这个错误你犯了吗?
|
Linux
【Linux系统开发】 x210开发板 虚拟驱动创建流程(驱动编译进内核)
【Linux系统开发】 x210开发板 虚拟驱动创建流程(驱动编译进内核)
134 0
|
芯片
LED驱动程序外部框架
LED驱动程序外部框架
67 0
|
芯片
具体单板的按键驱动程序(查询方式)-以IMX6ull单板为例子
具体单板的按键驱动程序(查询方式)-以IMX6ull单板为例子
89 0
|
Linux
linux驱动开发 使用设备树编写一个led驱动程序
linux驱动开发 使用设备树编写一个led驱动程序
243 0
|
Linux 开发工具 git
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十)LED模板驱动程序的改造:总线设备驱动模型
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十)LED模板驱动程序的改造:总线设备驱动模型
218 1
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十)LED模板驱动程序的改造:总线设备驱动模型
|
Linux 开发工具 git
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十五)具体单板的按键驱动程序(查询方式)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十五)具体单板的按键驱动程序(查询方式)
243 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十五)具体单板的按键驱动程序(查询方式)
|
Linux 开发工具 芯片
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十四)查询方式的按键驱动程序_编写框架
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十四)查询方式的按键驱动程序_编写框架
171 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十四)查询方式的按键驱动程序_编写框架
|
Ubuntu Linux 编译器
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十七)具体单板的LED驱动程序
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十七)具体单板的LED驱动程序
182 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十七)具体单板的LED驱动程序