300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Android 驱动(10)----设备树(二)linux内核顶层am335x-evm.dts

Android 驱动(10)----设备树(二)linux内核顶层am335x-evm.dts

时间:2019-01-06 18:47:35

相关推荐

Android 驱动(10)----设备树(二)linux内核顶层am335x-evm.dts

设备树(二)linux内核顶层am335x-evm.dts

摘自:/xiaojiezuo123/article/details/49890507

了解基本的dts知识之后,就可以为编写自己的dts文件了。Forlinx的OK335xD核心板和底板包含的资源有NANDFLASH、SDRAM、MMC、LCD、UART、USB、ETHERNET等等,因此dts文件必须要提供对它们正确的描述。

第一步,复制相近硬件的dts文件:

am335x-bone.dts -> maria_am335x.dts

am335x-bone-common.dtsi -> maria_am335x-common.dtsi

相比较于从头重新编写所有内容,在相近硬件的基础上修改会简单得多。am335x-bone开发板使用了TPS65217作为PMIC芯片,因此在它的基础上进行修改。

第二步,修改第一个文件maria_am335x.dts的内容:

#include "am335x-bone-common.dtsi" 改为

#include "maria_am335x-common.dtsi"

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

无需修改的代码:

&ldo3_reg {

regulator-min-microvolt = <1800000>;

regulator-max-microvolt = <3300000>;

regulator-always-on;

};

&sham {

status = "okay";

};

&aes {

status = "okay";

};

&ldo3_reg是tps65217其中的一个输出。此描述表示tps65217的LDO3输出电平范围为1.8V~3.3V,并一直打开。

&sham 表示 SHA crypto Module!

&aes 表示 AES crypto Module!

(****找了半天也不知道这俩个东东到底是神马~?内存映射里面它们的地址也是reserved!)

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

总结:

maria_am335x.dts的内容非常少,因为大部分的描述并没有放置在这里,而是在更底层;

如果在这个文件里加入从未有过的描述,则描述会被添加;

如果在这个文建立加入底层已有的描述,则描述会覆盖底层;

这样的策略保证了底层的通用代码基本不需要修改,all you have to do,就是更改和你的板子相关的两个文件xx.dts和xx-common.dts!

设备树(三)linux内核主线次顶层common-335x-evm.dts

====================================

1.修改model和compitable值:

model = "TI AM335x maria_am335x";

compatible = "ti,maria_am335x", "ti,am33xx";

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

无需修改的代码:

cpu@0 {

cpu0-supply = <&dcdc2_reg>;

};

cpu@0的cpu0-supply项,原值为dcdc2_reg,不用更改,因为在OK335xD中就是用TPS65217的dcdc2通道来给core部分供电。如果你设计的电路使用dcdc1或其它通道,就修改成相应的值。

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

====================================

2.修改memory的值:

memory {

device_type = "memory";

reg = <0x80000000 0x20000000>; /* 512 MB */

};

这个是比较关键的参数。0x80000000是起始地址,查阅AM335x的技术手册会知道这是外部SRAM的起始地址,它支持的最大空间为1G,既0x80000000~0xBFFFFFFF。这里的0x20000000代表空间大小,即512M。

修改之前的原值是0x10000000,为256M。

====================================

3.leds项,修改为如下所示:

led@2 {

label = "maria_335x:red:usr_led0";

gpios = <&gpio1 16 GPIO_ACTIVE_LOW>;

linux,default-trigger = "";

default-state = "off";

};

led@3 {

label = "maria_335x:red:usr_led1";

gpios = <&gpio1 17 GPIO_ACTIVE_LOW>;

linux,default-trigger = "";

default-state = "off";

};

led@4 {

label = "maria_335x:red:usr_led2";

gpios = <&gpio1 18 GPIO_ACTIVE_LOW>;

linux,default-trigger = "";

default-state = "on";

};

led@5 {

label = "maria_335x:red:usr_led3";

gpios = <&gpio1 19 GPIO_ACTIVE_LOW>;

linux,default-trigger = "";

default-state = "on";

};

GPIO_ACTIVE_LOW是这四个LED灯是低电平有效,有效即点亮状态。当LED使用IO口直接驱动时,就是高电平有效,要设置为GPIO_ACTIVE_HIGH;当LED使用VCC上拉灌电流时,就是低电平有效,要设置为GPIO_ACTIVE_LOW。

初始状态设置为,两个LED亮,两个LED不亮。

====================================

4.删掉有关vmmcsd_fixed的内容:

vmmcsd_fixed: fixedregulator@0 {

compatible = "regulator-fixed";

regulator-name = "vmmcsd_fixed";

regulator-min-microvolt = <3300000>;

regulator-max-microvolt = <3300000>;

};

SD卡的驱动,在AM335x的技术手册中被称为mmc外设,在OK335xD的底板上由DCDC芯片MP2102供电,不受AM335x控制,因此将这条描述去掉。而查看am335x-bone对应的beaglebone的板子,会发现它的SD卡由TPS65217的LDO4来供电,而TPS65217受AM335x控制,因此需要这条描述。

其它关于MMC的内容,另外因为MMC使用了4位宽度,还可以去掉mmc1_dat4至mmc1_dat7的内容:

emmc_pins: pinmux_emmc_pins {

pinctrl-single,pins = <

0x80 (PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_csn1.mmc1_clk */

0x84 (PIN_INPUT_PULLUP | MUX_MODE2) /* gpmc_csn2.mmc1_cmd */

0x00 (PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad0.mmc1_dat0 */

0x04 (PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad1.mmc1_dat1 */

0x08 (PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad2.mmc1_dat2 */

0x0c (PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad3.mmc1_dat3 */

0x10 (PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad4.mmc1_dat4 */

0x14 (PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad5.mmc1_dat5 */

0x18 (PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad6.mmc1_dat6 */

0x1c (PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_ad7.mmc1_dat7 */

>;

};

====================================

5.修改有关am33xx_pinmux内容:

user_leds_s0: user_leds_s0 {

pinctrl-single,pins = <

0x40 (PIN_OUTPUT | MUX_MODE7) /* gpmc_a0.gpio1_16 */

0x44 (PIN_OUTPUT | MUX_MODE7) /* gpmc_a1.gpio1_17 */

0x48 (PIN_OUTPUT | MUX_MODE7) /* gpmc_a2.gpio1_18 */

0x4C (PIN_OUTPUT | MUX_MODE7) /* gpmc_a3.gpio1_19 */

>;

};

AM335x的IO口可以分配不同的外设功能,比如ZCZ封装的C17引脚,默认的功能是I2C0_SDA,除此之外它还能做timer7、uart2_ctsn、eCAP2_in_PWM2_out、gpio3_5的功能来使用。设置引脚的pinmux功能,在AM335x中被称为Control Module,它的起始地址为0x44E10000。

从0x44E10000开始偏移0x800的地址,是各种各样的conf寄存器:

conf__Register (offset = 800h–A34h)

conf寄存器的第6位是slewctrl,选择快或慢的slew rate;

conf寄存器的第5位是rxactive,为0是disabled,为1是enabled;

conf寄存器的第4位是putypesel,选择上拉或者下拉,为0是pulldown,为1是pullup;

conf寄存器的第3位是puden,使能上拉或者下拉,为0是enables,为1是disabled;

conf寄存器的第2-0位是mmode,引脚的功能模式选择。

以上面的user_leds_s0为例,0x40表示地址为0x44E10840的conf寄存器,它的名称为CONF_GPMC_A0,用来设置ZCZ封装的R13号引脚;R13号引脚的功能分别是gpmc_a0、gmii2_txen、rgmii2_tctl、rmii2_txen、gpmc_a16、pr1_mii_mt1_clk、ehrpwm1_tripzone_input、gpio1_16,我要使用的是最后一个功能,因此为MUX_MODE7;不需要上拉或者下拉电阻,因此设置为PIN_OUTPUT。

PIN_OUTPUT定义在include/dt-bindings/pinctrl/am33xx.h中:

如果要选择上拉,则为PIN_OUTPUT_PULLUP;

如果要选择下拉,则为PIN_OUTPUT_PULLDOWN。

其它的pinmux需要修改的地方有:

****************************

将clkout2_pin删掉:

pinctrl-0 = <&clkout2_pin>;

clkout2_pin: pinmux_clkout2_pin {

pinctrl-single,pins = <

0x1b4 (PIN_OUTPUT_PULLDOWN | MUX_MODE3) /* xdma_event_intr1.clkout2 */

>;

};

这是因为OK335xD的板子没有将D14引脚conf_xdma_event_intr1设置为clkout1作为时钟输出,而是作为LCD的控制引脚。

****************************

修改cpsw_default:

cpsw_default: cpsw_default {

pinctrl-single,pins = <

/* Slave 1 */

0x114 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txen.mii1_txen */

0x118 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxdv.mii1_rxdv */

0x11c (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd3.mii1_txd3 */

0x120 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd2.mii1_txd2 */

0x124 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd1.mii1_txd1 */

0x128 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd0.mii1_txd0 */

0x12c (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_txclk.mii1_txclk */

0x130 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxclk.mii1_rxclk */

0x134 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd3.mii1_rxd3 */

0x138 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd2.mii1_rxd2 */

0x13c (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd1.mii1_rxd1 */

0x140 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd0.mii1_rxd0 */

0X10C (PIN_OUTPUT | MUX_MODE0) /* mii1_crs.gmii1_crs */

>;

};

cpsw_sleep: cpsw_sleep {

pinctrl-single,pins = <

/* Slave 1 reset value */

0x114 (PIN_INPUT_PULLDOWN | MUX_MODE7)

0x118 (PIN_INPUT_PULLDOWN | MUX_MODE7)

0x11c (PIN_INPUT_PULLDOWN | MUX_MODE7)

0x120 (PIN_INPUT_PULLDOWN | MUX_MODE7)

0x124 (PIN_INPUT_PULLDOWN | MUX_MODE7)

0x128 (PIN_INPUT_PULLDOWN | MUX_MODE7)

0x12c (PIN_INPUT_PULLDOWN | MUX_MODE7)

0x130 (PIN_INPUT_PULLDOWN | MUX_MODE7)

0x134 (PIN_INPUT_PULLDOWN | MUX_MODE7)

0x138 (PIN_INPUT_PULLDOWN | MUX_MODE7)

0x13c (PIN_INPUT_PULLDOWN | MUX_MODE7)

0x140 (PIN_INPUT_PULLDOWN | MUX_MODE7)

0X10C (PIN_INPUT_PULLDOWN | MUX_MODE7)

>;

};

首先是删除0x110对应的mii1_rxerr描述,因为OK335xD将它当成了IO口使用;

其次是增加0x10c描述,它对应gmii1_crs功能。

====================================

6.修改TPS65217的描述:

dcdc2_reg: regulator@1 {

/* VDD_MPU voltage limits 0.95V - 1.26V with +/-4% tolerance */

regulator-name = "vdd_core";

regulator-min-microvolt = <925000>;

regulator-max-microvolt = <1325000>;

regulator-boot-on;

regulator-always-on;

};

dcdc3_reg: regulator@2 {

/* VDD_CORE voltage limits 0.95V - 1.1V with +/-4% tolerance */

regulator-name = "vdd_mpu";

regulator-min-microvolt = <925000>;

regulator-max-microvolt = <1150000>;

regulator-boot-on;

regulator-always-on;

};

am335x-bone是使用DCDC2用作mpu,DCDC3用作core;而OK335xD刚好反过来。

====================================

总结:

修改完了之后,执行make xx.dtb命令,例如:

make ARCH=arm CROSS_COMPILE=/opt/arm-arago-linux-gcc/usr/bin/arm-linux-gnueabihf- -j8 maria_am335x.dtb

之后在arch/arm/boot/dts下会生成maria_am335x.dtb文件。

将它通过tftp拷贝进内存运行,就会发现OK335xD欢快的跑起来了,串口刷刷的打印,而且2个LED灯点亮,2个LED灯熄灭!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。