1. dts和dtsi完成的功能

 1 uart5: serial@021f4000 {2     compatible = "fsl,imx6sx-uart",3                 "fsl,imx6q-uart", "fsl,imx21-uart";4     reg = <0x021f4000 0x4000>;5     interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;6     clocks = <&clks IMX6SX_CLK_UART_IPG>,7             <&clks IMX6SX_CLK_UART_SERIAL>;8     clock-names = "ipg", "per";9     dmas = <&sdma 33 4 0>, <&sdma 34 4 0>;
10     dma-names = "rx", "tx";
11     status = "disabled";
12 };

以上这段代码更多出现在*.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。

1 &uart5 {
2     pinctrl-names = "default";
3     pinctrl-0 = <&pinctrl_uart5>;
4     fsl,uart-has-rtscts;
5     status = "okay";
6 };

以上这段代码更多出现在*.dts中

在*.dts中如果想对该设备进行操作,需要进行override,至少status需要从disabled设置为okay, 当然也有可能需要对compatible属性进行重写(为了和自己的driver匹配),另外需要使用&label首先引用该设备,使用pinctrl-names和pinctrl-0进行引脚的配置,当然这里可能出现多组引脚的配置,如下代码:

 1 &usdhc3 {2     pinctrl-names = "default", "state_100mhz", "state_200mhz";3     pinctrl-0 = <&pinctrl_usdhc3>;4     pinctrl-1 = <&pinctrl_usdhc3_100mhz>;5     pinctrl-2 = <&pinctrl_usdhc3_200mhz>;6     bus-width = <8>;7     cd-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>;8     wp-gpios = <&gpio2 15 GPIO_ACTIVE_HIGH>;9     keep-power-in-suspend;
10     enable-sdio-wakeup;
11     vmmc-supply = <&vcc_sd3>;
12     status = "okay";
13 };

而这里面的pinctrl-0对应的pinctrl_usdhc3内容如下:

 1 pinctrl_usdhc3: usdhc3grp {2     fsl,pins = <3         MX6SX_PAD_SD3_CMD__USDHC3_CMD        0x170694         MX6SX_PAD_SD3_CLK__USDHC3_CLK        0x100715         MX6SX_PAD_SD3_DATA0__USDHC3_DATA0    0x170696         MX6SX_PAD_SD3_DATA1__USDHC3_DATA1    0x170697         MX6SX_PAD_SD3_DATA2__USDHC3_DATA2    0x170698         MX6SX_PAD_SD3_DATA3__USDHC3_DATA3    0x170699         MX6SX_PAD_SD3_DATA4__USDHC3_DATA4    0x17069
10         MX6SX_PAD_SD3_DATA5__USDHC3_DATA5    0x17069
11         MX6SX_PAD_SD3_DATA6__USDHC3_DATA6    0x17069
12         MX6SX_PAD_SD3_DATA7__USDHC3_DATA7    0x17069
13         MX6SX_PAD_KEY_COL0__GPIO2_IO_10        0x17059 /* CD */
14         MX6SX_PAD_KEY_ROW0__GPIO2_IO_15        0x17059 /* WP */
15         >;
16 };

这种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中操作?

 1 gpio-keys {2     compatible = "gpio-keys";3     pinctrl-names = "default";4     pinctrl-0 = <&pinctrl_gpio_keys>;5 6     volume-up {7         label = "Volume Up";8         gpios = <&gpio1 18 GPIO_ACTIVE_LOW>;9         linux,code = <KEY_VOLUMEUP>;
10     };
11
12     volume-down {
13         label = "Volume Down";
14         gpios = <&gpio1 19 GPIO_ACTIVE_LOW>;
15         linux,code = <KEY_VOLUMEDOWN>;
16     };
17 };

1 pinctrl_gpio_keys: gpio_keysgrp {
2     fsl,pins = <
3         MX6SX_PAD_CSI_DATA04__GPIO1_IO_18 0x17059
4         MX6SX_PAD_CSI_DATA05__GPIO1_IO_19 0x17059
5         >;
6 };

2. 当在串口driver中需要使用到某个pin脚作为普通输出IO,该如何操作?

1 sii902x_reset: sii902x-reset {
2     compatible = "gpio-reset";
3     reset-gpios = <&gpio3 27 1>;
4     reset-delay-us = <100000>;
5     #reset-cells = <0>;
6     status = "disabled";
7 };

最简单的不需要pinctrl来进行pin脚的设置,为什么???

3. 当在串口driver中需要使用某个muxpin脚作为ADC或者其他服用功能该如何操作?

这个问题其实上面有提到,就像上述的多个pin-names和多个pinctrl在后面的pinctrl中配置这个复用的管脚即可。

4. 当在串口driver中有可能想使能某个功能而不想写定在driver代码中,该如何操作?

1 &uart5 {
2     pinctrl-names = "default";
3     pinctrl-0 = <&pinctrl_uart5>;
4     fsl,uart-has-rtscts;
5     status = "okay";
6
7 };

只需要在driver中使用of函数读取此属性,如果有此字段,可以使能某些操作;如果没有就失能某些操作。

5. 当想向driver中传入一个常数如做delay延时操作等等,该如何操作?

1 &usdhc3 { 2 pinctrl-names = "default", "state_100mhz", "state_200mhz"; 3 pinctrl-0 = <&pinctrl_usdhc3>; 4 pinctrl-1 = <&pinctrl_usdhc3_100mhz>; 5 pinctrl-2 = <&pinctrl_usdhc3_200mhz>; 6 bus-width = <8>; 7 cd-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>; 8 wp-gpios = <&gpio2 15 GPIO_ACTIVE_HIGH>; 9 keep-power-in-suspend; 10 enable-sdio-wakeup; 11 vmmc-supply = <&vcc_sd3>; 12 status = "okay"; 13 };

android 驱动(6)---DTS 分析相关推荐

  1. 【Android SDM660源码分析】- 01 - 如何创建 UEFI XBL Protocol DXE_DRIVER 驱动及UEFI_APPLICATION 应用程序

    [Android SDM660源码分析]- 01 - 如何创建 UEFI XBL Protocol DXE_DRIVER 驱动及UEFI_APPLICATION 应用程序 一.创建DXE_DRIVER ...

  2. Android USB驱动源码分析(-)

    Android USB驱动中,上层应用协议里最重要的一个文件是android/kernel/drivers/usb/gadget/android.c.这个文件实现USB的上层应用协议. 首先包含了一些 ...

  3. Android USB驱动源码分析

    Android USB驱动中,上层应用协议里最重要的一个文件是android/kernel/drivers/usb/gadget/android.c.这个文件实现USB的上层应用协议. 首先包含了一些 ...

  4. MTK 驱动(66)---Android recovery UI实现分析

    Android recovery UI实现分析 Android recovery模式为何物? 关于这个问题, baidu上已经有无数的答案,不理解的朋友先补习一下.从纯技术角度来讲, recovery ...

  5. Android Hal层简要分析

    Android Hal层简要分析 Android Hal层(即 Hardware Abstraction Layer)是Google开发的Android系统里上层应用对底层硬件操作屏蔽的一个软件层次, ...

  6. Android的logger机制分析

    分析安卓的Logger机制 一.概述 Logger机制是在Android系统中提供的一个轻量级的日志系统,这个日志系统是以驱动程序的形式在内核空间实现的,在用户空间分别提供了Java接口和C/C++接 ...

  7. 【Android SDM660源码分析】- 02 - UEFI XBL QcomChargerApp充电流程代码分析

    [Android SDM660源码分析]- 02 - UEFI XBL QcomChargerApp充电流程代码分析 一.加载 UEFI 默认应用程序 1.1 LaunchDefaultBDSApps ...

  8. 【Android SDM660源码分析】- 03 - UEFI XBL GraphicsOutput BMP图片显示流程

    [Android SDM660源码分析]- 03 - UEFI XBL GraphicsOutput BMP图片显示流程 1. GraphicsOutput.h 2. 显示驱动初化 DisplayDx ...

  9. 【Android SDM660源码分析】- 04 - UEFI ABL LinuxLoader 代码分析

    [Android SDM660源码分析]- 04 - UEFI ABL LinuxLoader 代码分析 1. LinuxLoader.c 系列文章: <[Android SDM660开机流程] ...

  10. Android 音频源码分析——AndroidRecord录音(一)

    Android 音频源码分析--AndroidRecord录音(一) Android 音频源码分析--AndroidRecord录音(二) Android 音频源码分析--AndroidRecord音 ...

最新文章

  1. 客户端dmesg_打印调试技术 printk klogd dmesg(解决打印信息的问题)
  2. 排序算法笔记:堆排序 HeapSort in java
  3. 程序猿充电的五本优质编程技术书
  4. Jenkins 基础入门
  5. Ruby on Rails 终极部署方案 nginx+mina+puma
  6. ElasticSearch(笔记)
  7. C++STL与泛型编程(3)容器之分类与测试
  8. 信息安全工程师笔记-综合知识冲刺(三)
  9. nts包如何下周 php_【Composer】PHP开发者必须了解!(life)
  10. ubuntu下用postfix搭建邮件服务器
  11. [线性相关] 皮尔森相关系数的计算及假设检验
  12. jsp代码没有错,但是总是有红叉(一招解决)
  13. C站能力认证(C4前端基础认证) //任务一:构建可访问性HTML实例
  14. 速读原著-TCP/IP(网络文件系统)
  15. a73*2+a53*2指的是什么_考验你脑细胞的时候到了!杨花落尽子规啼,闻道龙标过五溪中的子规指的是什么?|考验|脑细胞-360GAME...
  16. NetSpider 网络蜘蛛1.0 的简介
  17. TypeScripy-类的基本使用
  18. 机房布线系统施工要点解析
  19. F2FS源码分析-1.3 [F2FS 元数据布局部分] Checkpoint结构
  20. 『杨百万』投资理财报告会场面火爆

热门文章

  1. 关于移植jSON编译时报错sbrkr.c:(.text+0xc): undefined reference to `_sbrk'处理
  2. Linux内核分析 - 网络[八补]:IP协议补充
  3. 内核中的UDP socket流程(6)——sendto
  4. Linux内核的Nand驱动流程分析
  5. ajax 刷新 保持原位置_JavaEE之Ajax第一课
  6. C51单片机————中断系统
  7. 类型的方法,以及关于Stringbuffer和String builder的相关补充
  8. 如何实现Python调用C代码--python与C之间如何通信(swig)
  9. Flask 学习 (二) blueprint 示例
  10. ZedGraph设置辅助线