这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» MCU» 为AM335x移植Linux内核主线代码——次顶层的maria_am335x-c

共1条 1/1 1 跳转至

为AM335x移植Linux内核主线代码——次顶层的maria_am335x-common.dts

菜鸟
2014-10-24 22:42:26 打赏

为AM335x移植Linux内核主线代码

三、次顶层的maria_am335x-common.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 =; /* 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 =; regulator-max-microvolt =; };



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 =; regulator-max-microvolt =; 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 =; regulator-max-microvolt =; 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灯熄灭!

(文章转载自edn博客 作者:MariannaZhu )

http://forum.eepw.com.cn/thread/262788/1




关键词: AM335x 移植 Linux 内核 主线 代码

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]