没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
传统的驱动写法和设备树驱动写法的区别就是如何指定硬件资源
(1)、传统方法:
<1> 分配 file_operations 机构体
<2> 设置.open 配置 pin 为输 出
.write 根据 APP 传入的值设置 pin 的高低电平
<3> 注册函数
<4> 入口
<5> 出口
优点:简单
缺点:不易扩展
(2)、总线设备驱动模型:
优点:易扩展
缺点:复杂 冗余代码太多 需重新编译
(3)、设备树:
分为两部分 <1> led_driver.c 同方法二一样
<2> 通过设备树文件.dts 文件来 指 定 资 源 , 内 核 根 据 该 文 件 来 构造
platform_device,运行的时候会去读取和解析 dts 文件 当需要更改时只需要重新定义 dts
文件就可以了 dts 文件最终会编译为 dtb 文件
缺点:复杂
优点:易扩展、无冗余代码、不需要重新编译内核或者驱动,只需要提供不一样的设备树文
件
传统驱动的写法
字符设备驱动的五个步骤
1、 分配 file_operation 结构体
static struct file_operations myled_oprs = {
.owner = THIS_MODULE, //宏,表示结构体本身
.open = led_open,
.write = led_write,
.release = led_release,
};
2、 设置 file_operation 结构体
3、 注册 file_operation 结构体
4、 入口
入口函数里面去注册 file_operations 结构体
static int myled_init(void)
{
major = register_chrdev(0, "myled", &myled_oprs);
led_class = class_create(THIS_MODULE, "myled");
device_create(led_class, NULL, MKDEV(major, 0), NULL, "led"); /*
/dev/led */ //自动创建设备文件
return 0;
}
5、 出口
static void myled_exit(void)
{
unregister_chrdev(major, "myled");
device_destroy(led_class, MKDEV(major, 0));
class_destroy(led_class);
}
总线设备驱动模型
内核中有很多 driver 和 device,需要管理,放在一个 Bus 里面,这个 Bus 是一个软件
概念。
Device 指定硬件资源
定义一个一个的 platform_device 并且去注册它
在 driver 方面要去定义个 platform_driver 结构体,并且去注册它
内核里有很多 device 和 driver,driver 要用哪个 device 获取硬件资源,它们之间需
要一个匹配,在 Bus 里面,常用 platform Bus。Bus_type
里面有个 match 函数指针,指向一个 match 函数,这个就是用来比较这个 driver 和
device,看看它们能不能匹配,如果能匹配就表明它们之间是配对的,device 就可以为
driver 提供硬件资源。如果双方匹配,就调用 probe 函数。
设备树写驱动程序
总结:之前硬件资源是写在 platform_device 的 c 文件中,现在把资源写在 dts 文件中,所
以说设备树也是 bus 驱动的一种改进方式。
对于 zynq 开 发 板 , 首 先 在 petalinux 工 程 的 目 录 下 , /project-spec/meta-
user/recipes-bsp/device-tree/files/system-user.dtsi 文件中添加设备树节点
然后 petalinx-build 命令编译修改的设备树
Petalinux-package –boot –fsbl ./image/linux/zynq_fsbl.elf –
fpga ./images/linux/design_1_wrapper.bit –uboot –force 命令生成 BOOT.BIN 和
image.ub 文件。将这两个文件拷贝进去 SD 卡的 FAT 中。
现在开始分析,dts 文件如何和 driver 文件匹配起来
static const struct of_device_id of_match_leds[] = {
{ .compatible = "jz2440_led", .data = NULL },
{ /* sentinel */ }
};
struct platform_driver led_drv = {
.probe = led_probe,
.remove = led_remove,
.driver = {
.name = "myled",
.of_match_table = of_match_leds,
}
};
of_match_table 表示能支持哪些来自 dts 设备树的平台总线设备
在 struct platform_device 结构体中有 struct device 元素,struct device_node*of_node;
DTS 文件 layout
/dts-v1/; 表示 dts 的版本
[memory reservations] //格式为:/memerserve/ <address> <length>;
保留的内存区域,比如你的板子有 64M 内存,其中有 2M 想留下来给自己使用,不想让内核
使用,就可以定义这个选项。内核使用全部内存的话就可以省略这个选项
重要
/{
[property definitions] //属性,用来描述硬件的信息
[child nodes] //子节点
}; 斜杠表示根 这个就是设备树的起点
Property 格式 1:
[label:] property-name = value;
compatible = "arm,cortex-a9"; compatible 就是属性
value 的写法 < > 里面是一个或者多个 32 位的数据
“ ” 字符串
[ ] byte string 00 11 22 16 进制表示的一个或者多个字节,一个字
剩余20页未读,继续阅读
资源评论
GunnerArsenal
- 粉丝: 2
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 薯条-数据库 1111111111111111
- win32汇编环境,在对话框中画五边形与六边形
- 思维导图制作-会计初级知识重难点-会计务实-概述
- 安国量产工具集合 支持U2 U3
- 思维导图制作-会计初级知识重难点-会计务实-会计基础
- 思维导图制作-会计初级知识重难点-会计务实-流动资产
- 思维导图制作-会计初级知识重难点-会计务实-非流动资产
- Python的Numpy库常见操作用法
- 思维导图制作-会计初级知识重难点-会计务实-所有者权益
- 西门子1200和1500 模拟量PID闭环控制程序模拟仿丨真案例 为PID函数仿丨真,只需要有一个PLC即可学习PID的应用方法, 不需要额外的变送器,温度检测,加热器等硬件设备即可模拟仿真轻松学习P
- 思维导图制作-会计初级知识重难点-会计务实-收入、费用和利润
- 基于阻抗的单向并网逆变器前馈控制策略研究,在电压畸变时验证,电网电压全前馈谐波抑制有效性 电流环采用QPR控制 图一整体电路与控制及工况给定图 图二不加电网电压全前馈控制图 图三不加电网电压全前馈电压
- 思维导图制作-会计初级知识重难点-会计务实-成本核算
- 思维导图制作-会计初级知识重难点-会计务实-政府会计基础
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功