[dts]DTS实例分析
此篇源文件arch/arm/boot/dts/imx6sx.dtsi
1. dts和dtsi完成的功能
以下是两段较为常见的dtsi和dts代码
uart5: serial@021f4000 {
compatible = "fsl,imx6sx-uart",
"fsl,imx6q-uart", "fsl,imx21-uart";
reg = <0x021f4000 0x4000>;
interrupts = <GIC_SPI IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clks IMX6SX_CLK_UART_IPG>,
<&clks IMX6SX_CLK_UART_SERIAL>;
clock-names = "ipg", "per";
dmas = <&sdma >, <&sdma >;
dma-names = "rx", "tx";
status = "disabled";
};
以上这段代码更多出现在*.dtsi中
一般会在*.dtsi中将芯片的外设接口资源都做定义,
如uart5作为该外设的label,node-name@unit-address作为设备的名称,node-name只是设备类型,uart1/uart2/uart3等可以都是serial名称,而@后面则跟着设备寄存器起始地址。
compatible默认属性,
reg寄存器地址和长度,该uart5节点的父节点为aips2,在父节点中指明#address-cells = <1>;#size-cells = <1>;这决定了子节点字段长度address为1, length为1. 所以reg格式为reg = <0x021f4000 0x4000>;
interrupts对应的中断号和中断出发方式,uart5的父节点为aips2,而aips2的父节点为soc,soc节点定义了interrupt-parent = <&intc>;给出了节点所依附的中断控制器,如果节点没有指定interrupt-parent,那么就从父节点继承,所以该uart5节点继承了soc的中断控制器,即intc. 而intc节点的#interrupt-cells = <3>;所以就有了该节点中interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;三个字段,具体这三个字段的含义可以参考芯片文档的描述。其中GIC_SPI定义在include/dt-bindings/interrupt-controller/arm-gic.h值为0,
clock外设时钟,在include/dt-bindings/clock/imx6sx-clock.h,指定设备工作时钟
status一般会设为disabled。
&uart5 {
pinctrl-names = "default";
pinctrl- = <&pinctrl_uart5>;
fsl,uart-has-rtscts;
status = "okay";
};
以上这段代码更多出现在*.dts中
在*.dts中如果想对该设备进行操作,需要进行override,至少status需要从disabled设置为okay, 当然也有可能需要对compatible属性进行重写(为了和自己的driver匹配),另外需要使用&label首先引用该设备,使用pinctrl-names和pinctrl-0进行引脚的配置,当然这里可能出现多组引脚的配置,如下代码:
&usdhc3 {
pinctrl-names = "default", "state_100mhz", "state_200mhz";
pinctrl-0 = <&pinctrl_usdhc3>;
pinctrl- = <&pinctrl_usdhc3_100mhz>;
pinctrl- = <&pinctrl_usdhc3_200mhz>;
bus-width = <>;
cd-gpios = <&gpio2 GPIO_ACTIVE_HIGH>;
wp-gpios = <&gpio2 GPIO_ACTIVE_HIGH>;
keep-power-in-suspend;
enable-sdio-wakeup;
vmmc-supply = <&vcc_sd3>;
status = "okay";
};
而这里面的pinctrl-0对应的pinctrl_usdhc3内容如下:
pinctrl_usdhc3: usdhc3grp {
fsl,pins = <
MX6SX_PAD_SD3_CMD__USDHC3_CMD 0x17069
MX6SX_PAD_SD3_CLK__USDHC3_CLK 0x10071
MX6SX_PAD_SD3_DATA0__USDHC3_DATA0 0x17069
MX6SX_PAD_SD3_DATA1__USDHC3_DATA1 0x17069
MX6SX_PAD_SD3_DATA2__USDHC3_DATA2 0x17069
MX6SX_PAD_SD3_DATA3__USDHC3_DATA3 0x17069
MX6SX_PAD_SD3_DATA4__USDHC3_DATA4 0x17069
MX6SX_PAD_SD3_DATA5__USDHC3_DATA5 0x17069
MX6SX_PAD_SD3_DATA6__USDHC3_DATA6 0x17069
MX6SX_PAD_SD3_DATA7__USDHC3_DATA7 0x17069
MX6SX_PAD_KEY_COL0__GPIO2_IO_10 0x17059 /* CD */
MX6SX_PAD_KEY_ROW0__GPIO2_IO_15 0x17059 /* WP */
>;
};
这种pinctrl的设置可参照/Documentation/devicetree/bindinsg/pinctrl下示例代码
2. 通常会碰到的实际问题
到此,问题出现了:
1. 当写一个按键驱动,应该如何在*.dts或者*.dtsi中操作?
2. 当在串口driver中需要使用到某个pin脚作为普通输出IO,该如何操作?
3. 当在串口driver中需要使用某个muxpin脚作为ADC或者其他服用功能该如何操作?
4. 当在串口driver中有可能想使能某个功能而不想写定在driver代码中,该如何操作?
5. 当想向driver中传入一个常数如做delay延时操作等等,该如何操作?
解答:
1. 当写一个按键驱动,应该如何在*.dts或者*.dtsi中操作?
gpio-keys {
compatible = "gpio-keys";
pinctrl-names = "default";
pinctrl- = <&pinctrl_gpio_keys>; volume-up {
label = "Volume Up";
gpios = <&gpio1 GPIO_ACTIVE_LOW>;
linux,code = <KEY_VOLUMEUP>;
}; volume-down {
label = "Volume Down";
gpios = <&gpio1 GPIO_ACTIVE_LOW>;
linux,code = <KEY_VOLUMEDOWN>;
};
};
pinctrl_gpio_keys: gpio_keysgrp {
fsl,pins = <
MX6SX_PAD_CSI_DATA04__GPIO1_IO_18 0x17059
MX6SX_PAD_CSI_DATA05__GPIO1_IO_19 0x17059
>;
};
2. 当在串口driver中需要使用到某个pin脚作为普通输出IO,该如何操作?
sii902x_reset: sii902x-reset {
compatible = "gpio-reset";
reset-gpios = <&gpio3 27 1>;
reset-delay-us = <>;
#reset-cells = <>;
status = "disabled";
};
最简单的不需要pinctrl来进行pin脚的设置,为什么???
3. 当在串口driver中需要使用某个muxpin脚作为ADC或者其他服用功能该如何操作?
这个问题其实上面有提到,就像上述的多个pin-names和多个pinctrl在后面的pinctrl中配置这个复用的管脚即可。
4. 当在串口driver中有可能想使能某个功能而不想写定在driver代码中,该如何操作?
&uart5 {
pinctrl-names = "default";
pinctrl- = <&pinctrl_uart5>;
fsl,uart-has-rtscts;
status = "okay"; };
只需要在driver中使用of函数读取此属性,如果有此字段,可以使能某些操作;如果没有就失能某些操作。
5. 当想向driver中传入一个常数如做delay延时操作等等,该如何操作?
&usdhc3 {
pinctrl-names = "default", "state_100mhz", "state_200mhz";
pinctrl- = <&pinctrl_usdhc3>;
pinctrl- = <&pinctrl_usdhc3_100mhz>;
pinctrl- = <&pinctrl_usdhc3_200mhz>;
bus-width = <8>;
cd-gpios = <&gpio2 GPIO_ACTIVE_HIGH>;
wp-gpios = <&gpio2 GPIO_ACTIVE_HIGH>;
keep-power-in-suspend;
enable-sdio-wakeup;
vmmc-supply = <&vcc_sd3>;
status = "okay";
};
只需要在driver中读取bus-width字段的值,即可获取到8这个常量,注意在devicetree中命名字段更多使用"-"而非下划线"_".
[dts]DTS实例分析的更多相关文章
- Linux I2C设备驱动编写(三)-实例分析AM3359
TI-AM3359 I2C适配器实例分析 I2C Spec简述 特性: 兼容飞利浦I2C 2.1版本规格 支持标准模式(100K bits/s)和快速模式(400K bits/s) 多路接收.发送模式 ...
- 【转】Linux I2C设备驱动编写(三)-实例分析AM3359
原文网址:http://www.cnblogs.com/biglucky/p/4059586.html TI-AM3359 I2C适配器实例分析 I2C Spec简述 特性: 兼容飞利浦I2C 2.1 ...
- RPC原理及RPC实例分析
在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 1 2 3 4 5 6 public class ...
- java基础学习05(面向对象基础01--类实例分析)
面向对象基础01(类实例分析) 实现的目标 1.如何分析一个类(类的基本分析思路) 分析的思路 1.根据要求写出类所包含的属性2.所有的属性都必须进行封装(private)3.封装之后的属性通过set ...
- (转)实例分析:MySQL优化经验
[IT专家网独家]同时在线访问量继续增大,对于1G内存的服务器明显感觉到吃力,严重时甚至每天都会死机,或者时不时的服务器卡一下,这个问题曾经困扰了我半个多月.MySQL使用是很具伸缩性的算法,因此你通 ...
- sql注入实例分析
什么是SQL注入攻击?引用百度百科的解释: sql注入_百度百科: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具 ...
- 实例分析ELF文件静态链接
参考文献: <ELF V1.2> <程序员的自我修养---链接.装载与库>第4章 静态链接 开发平台: [thm@tanghuimin static_link]$ uname ...
- 用实例分析H264 RTP payload
用实例分析H264 RTP payload H264的RTP中有三种不同的基本负载(Single NAL,Non-interleaved,Interleaved) 应用程序可以使用第一个字节来识别. ...
- nodejs的模块系统(实例分析exprots和module.exprots)
前言:工欲善其事,必先利其器.模块系统是nodejs组织管理代码的利器也是调用第三方代码的途径,本文将详细讲解nodejs的模块系统.在文章最后实例分析一下exprots和module.exprots ...
- Android Touch事件原理加实例分析
Android中有各种各样的事件,以响应用户的操作.这些事件可以分为按键事件和触屏事件.而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制. ...
随机推荐
- C++ Vector 用法总结
1, 头文件#include <vector> using namespace std; 2,定义与初始化 一般结合模板来使用 vector <Elem> ...
- Codeforces Round #365 (Div. 2) D 树状数组+离线处理
D. Mishka and Interesting sum time limit per test 3.5 seconds memory limit per test 256 megabytes in ...
- 2015GitWebRTC编译实录5
2015.07.20 libaudio_encoder_interface/libaudio_decoder_interface 编译通过将encoder,decoder两个lib合并了,后面需要看看 ...
- ZOJ 1076 Gene Assembly
原题链接 题目大意:首先学习一个生物学的单词,exon:外显子,DNA序列中能够翻译表达的片段.给出很多外显子的起始点和终点,求寻找包含最多外显子的一条链,并且输出这些外显子的编号. 解法:先把所有外 ...
- UpdatePanel与$.function()同时使用问题
在.NET中使用了UpdatePanel,里面的输入框使用了jQuery的日历选择器,接下来介绍下两者同时使用的一些细节及问题的解决方法,感兴趣的各位可以参考下哈 今天,在.NET中使用了Update ...
- HTML---常见标签与插入背景音乐;
插入背景音乐 (一).基本语法: embed src=url 说明:embed可以用来插入各种多媒体,格式可以是 Midi.Wav.AIFF.AU.MP3等等, Netscape及新版的IE 都支持 ...
- leetcode 39 Combination Sum --- java
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...
- 【P1203】买花
我先在已经弱到连高精乘单精都能写错的地步了QAQ 原题: 求一个小于等于N的数M,使得phi(M)/M最小,其中phi(M)是与M互质且比M小的数的个数.例如phi(4)=2,因为1,3和4互质. N ...
- java 读取文件的字节数组
/*文件64位编码*/ public static void main(String[] args) { byte[] fileByte = toByteArray(newFile); St ...
- Verilog
1.位拼接运算符{}