AM335X移植OpenWRT 一


我手上有一个forlinx的AM335X开发板OK335xD,自带的Linux内核是3.2的而且我测试发现一旦网络传输数据稍大kernel就panic,调试了好久都没搞好(我试了TI官方的SDK,也一样)。

最近看到LEDE是支持OMAP的,抱着试试看的精神就下了最新的LEDE 17.1.04试试。编译用了默认的AM33xx target profile,uboot随便找了个之前AM335x的uboot(这是个坑)。编译后bin目录里是内核,文件系统需要到build_dir的linux_omap里去找root.ext4,我嫌麻烦就上LEDE官网下了一个am335x-evm-ext4-sdcard.img.gz(别看是5M的压缩文件,解压后是256M大文件,估计里面都是0XFF或者是0x00,其实真正文件系统用到10M左右,这个以后可以优化缩小一下-_-!!!)烧到SD卡里,然后替换一下uboot和kernel。

接下来是device tree文件了,这个就要花时间调试了。参考TI EVM的am335x-evm.dts文件复制到forlinx.dts,修改dts/Makefile只编译forlinx.dtb。

需要注意的点是:

  1. 根据板子原理图电源管理芯片是tps65217,需要添加tps65217的节点,而且要根据原理图写好各个dcdc和LDO的节点。 TI的evm板子里DCDC2是MPU,DCDC3是core,而OK335xD反了一下,而且DCDC1用来控制DDR3。

    dcdc1_reg: regulator@0 {
        /* DDR3 VDD_CORE voltage limits 0.95V - 1.1V with +/-4% tolerance */
        regulator-name = "vdd_ddr3";
        regulator-min-microvolt = <925000>;
        regulator-max-microvolt = <1150000>;
        regulator-boot-on;
        regulator-always-on;
        regulator-always-on;};dcdc2_reg: regulator@1 {
        /* VDD_CORE voltage limits 0.95V - 1.1V with +/-4% tolerance */
        regulator-name = "vdd_core";
        regulator-min-microvolt = <925000>;
        regulator-max-microvolt = <1150000>;
        regulator-boot-on;
        regulator-always-on;};dcdc3_reg: regulator@2 {
        /* VDD_MPU voltage limits 0.95V - 1.26V with +/-4% tolerance */
        regulator-name = "vdd_mpu";
        regulator-min-microvolt = <925000>;
        regulator-max-microvolt = <1351500>;
        regulator-boot-on;
        regulator-always-on;};

    具体电压可以比对官方的datasheet的OPP:

    enter image description here

    上图能看到OPP turbo时能到720M,其实AM335x A8最高能支持到1G,好像最新LEDE主分支里合并了4.9支持1G了,我现在用的4.4.92还不支持,最高只能跑到720M,等下次更新了再说吧。

    root@OpenWrt:~# cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies 
    275000 500000 600000 720000
  2. OK335xD用的是NAND(暂时不用),所以只有添加一个SD卡启动的MMC1就好了:

    &mmc1 {
        bus-width = <4>;
        vmmc-supply = <&vdd33>;
        pinctrl-names = "default";
        pinctrl-0 = <&mmc1_pins>;
        cd-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
        disable-wp;
        status = "okay";};
  3. AM335X支持双网口(可以作为路由器),而OK335xD只用了网口1,PHY芯片用了AR8031,而且支持千兆网口(用了rgmii接口),一般rgmii接口信号线需要引入人为的delay,参考这篇有说明。我看了AR8031的datasheet和内核的代码,AR8031是直接支持tx和rx delay的,只要设置一下debug register就行了,内核驱动at803x.c里也是这么干的:

        if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) {
            ret = phy_write(phydev, AT803X_DEBUG_ADDR,
                    AT803X_DEBUG_SYSTEM_MODE_CTRL);
            if (ret)
                return ret;
            ret = phy_write(phydev, AT803X_DEBUG_DATA,
                AT803X_DEBUG_RGMII_TX_CLK_DLY);
            if (ret)
                return ret;
        }

    但我没看到rgmii-rxid和rgmii-id的支持,所以至少对于我手上的4.4.92来说device tree只支持rgmii-txid:

    &mac {
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&cpsw_default>;
        pinctrl-1 = <&cpsw_sleep>;
        slaves = <1>;
        status = "okay";};&davinci_mdio {
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&davinci_mdio_default>;
        pinctrl-1 = <&davinci_mdio_sleep>;
        status = "okay";};&cpsw_emac0 {
        phy_id = <&davinci_mdio>, <0>;
        phy-mode = "rgmii-txid";};

    mac集成在AM335X里,而且只用了一个网口, phy-mode是rgmii-txid。

好吧,先写到这里吧,还有很多东西没写,完整的dts在这里。下一篇要写写折腾了我很久的网口问题!!!

参考:

http://www.eefocus.com/marianna/blog/14-10/306285_18a90.html



本文章由作者:佐须之男 整理编辑,原文地址: AM335X移植OpenWRT 一
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资 源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。

相关推荐