原创 为AM335x移植Linux内核主线代码(3)次顶层的maria_am335x-common.dts

2014-10-22 13:37 2131 7 7 分类: MCU/ 嵌入式 文集: Linux Kernel的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灯熄灭!

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /2 下一条