This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM6548:使用SDK 8.2 从Uboot传递MAC ID时出现问题

Guru**** 2540720 points
Other Parts Discussed in Thread: AM6548

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1093601/am6548-issue-in-passing-mac-id-from-uboot-with-sdk-8-2

部件号:AM6548

您好,TI:

我最近将代码迁移到了我们的定制板AM6548控制器的SDK 8.2。

在SDK 7.1 中,我用于从ucoot为ICSSG以太网传递MAC ID,但同一逻辑不适用于SDK 8.2。 下面是SDK 7.1 中的补丁,我曾用来设置MAC ID,但现在却没有在SDK 8.2 中获取这些env变量

差分- git a/board/ti/am65x/evp.c b/board/ti/am65x/evp.c
索引045a43c498..6dc99a97.12100644亿
-- a/board/ti/am65x/EVM-c.
+++ b/board/ti/am65x/EVM-c
@@-20,6 + 20,7 @@
#include <board.h>
#include <soC.h>
#include <ASM/arch/sys_proto.h>
++包括<i2c.h>

#include "./common/board_detect.h"

@@-228,6 + 229,53 @@静态int init_daughtercard_det_gPIO(char *gPIO_NAME,struct gPIO_desc *desc)
返回dm_gpio_set_dir_flags (desc,gpiod_is_in);
}

+u64 mac_to_u64 (u8 mac[6])
+{
+内部I;
+ u64地址= 0;
+
+表示(i = 0;i < 6;I++){
+地址<<=8;
+ addr |= mac[i];
+}
+退货地址;
+}
+
+void u64_to_mac(u64 addr,u8 mac[6])
+{
+ Mac[5]=地址;
+ Mac[4]=地址>> 8;
+ Mac[3]=地址>> 16;
+ Mac[2]=地址>> 24;
+ Mac[1]=地址>> 32;
+ Mac[0]=地址>> 40;
+
+}
+
+void set_ETH_Mac_add (void)
+{
+ struct udevice*dev1;
+ uchar mac_get1[6],mac_get2[6];
+ u64 u64macc_add;
+ int j=0,MAC_CNT=4;
+ char enetvar[32];
+
+ i2c_Get_chip_of_busnum(0),0x50,6,&dev1);
+ dm_i2c_read(dev1, 0x00, mac_get1, 6);
+
如果(is_valid_ethaddr (mac_get1)){,则为+
+ u64macc_add = mac_to_u64 (mac_get1);
+
对于(j=0;j<MAC_CNT;j++){
+
+ u64_to_Mac (u64macc_add,mac_get2);
+ sprintf (enetvar,"eth%daddr",j+1);
+ eth_env_set_enetaddr (enetvar,mac_get2);
+ u64macc_add = u64macc_add+1;
+}
+}
+}
+
静态int probe_daughtercards(void)

结构ti_am6_eeprom EP;
@@-330,8 +378,8 @@静态int probe_daughtercards(void)
Daugh_card_no_of_MAC_ADDR,
&Mac_addr_cnt);
如果(ret){
- pr_err("读取0x%02x的子卡EEPROM失败%d\n",
- i2c_addr,ret);
+/* pr_err("读取0x%02x的子卡EEPROM失败%d\n",
+ i2c_addr,ret);*/
/*
*即使这非常严重,我们也跳过一下
*此特定子卡,而不是结尾
@@-402,6 + 450,9 @@ dflt:
}

#ifndef config_spL_build
+
+ Set_Eth_Mac_add();
+
/*将设备树覆盖应用于U-Boot环境(如果有)*/
如果(strlen(name_overles))
返回env_set ("name_overlates",name_overlays);

对于SDK 8.2 ,我需要做什么来从uboot设置MAC吗

谢谢!

Sarfaraz

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    要补充上述问题,I2C读取在SDK 8.2 中存在问题

    如果我使用i2c md命令从SDK 8.2 读取i2c EEPROM,它将给出所有0xff值  

    SDK 8.2 的输出

    => i2c md 0x50 0x00
    0000:FF ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff FF

    SDK 7.1 的输出

    => i2c md 0x50 0x00
    0000:45 41 54 4F 4e 0A 00 00 00 00 00 00 00 00 00 00 00 Eaton

    这似乎是SDK更改的一些问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Sarfaraz,
    我在AM64x EVM上使用Linux SDK 8.2 检查了通过“i2c...”cmd @u-boot读取的EEPROM,因为我目前没有访问AM65x EVM的权限。
    我要附上日志附件供您参考,其中,MAC匹配EEPROM的u-boot环境变量读取如下所示:

    - two MACs from EEPROM read
    70 ff 76 1d ec 80 
    70 ff 76 1d ec 81
    
    - printenv @u-boot
    ...
    eth1addr=70:ff:76:1d:ec:80
    eth2addr=70:ff:76:1d:ec:81
    ...

    我们是否可以在您的设置中使用以下cmds @u-boot提示来读取EEPROM?
    => i2c dev 0
    => i2c MD 0x50 0.2 0x100
    最佳,
    -洪

    e2e.ti.com/.../am64x_5F00_hs_5F00_evm_5F00_eeprom_5F00_read.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Hong:  

    感谢您的输入。使用常规命令,我无法读取i2c EEPROM,但使用您提供的命令,我可以读取EEPROM内容。

    我的目标是从EEPROM读取MAC ID (与EVM中针对我们的定制板所提到的位置不同)。 使用SDK 7,我可以读取Mac ID并将其存储在eth1addr和eth2addr中。但是使用SDK 8.2 ,类似的修补程序不起作用。uboot无法从EVM.c文件创建eth1addr。

    我已从SDK 7.1 中附加了EVM.c的补丁以供参考,但此类似补丁不适用于sdk8,我怀疑它与无法使用常规命令(如7.1)读取i2c EEPROM有关

    差分- git a/board/ti/am65x/evp.c b/board/ti/am65x/evp.c
    索引045a43c498..6dc99a97.12100644亿
    -- a/board/ti/am65x/EVM-c.
    +++ b/board/ti/am65x/EVM-c
    @@-20,6 + 20,7 @@
    #include <board.h>
    #include <soC.h>
    #include <ASM/arch/sys_proto.h>
    ++包括<i2c.h>

    #include "./common/board_detect.h"

    @@-228,6 + 229,53 @@静态int init_daughtercard_det_gPIO(char *gPIO_NAME,struct gPIO_desc *desc)
    返回dm_gpio_set_dir_flags (desc,gpiod_is_in);
    }

    +u64 mac_to_u64 (u8 mac[6])
    +{
    +内部I;
    + u64地址= 0;
    +
    +表示(i = 0;i < 6;I++){
    +地址<<=8;
    + addr |= mac[i];
    +}
    +退货地址;
    +}
    +
    +void u64_to_mac(u64 addr,u8 mac[6])
    +{
    + Mac[5]=地址;
    + Mac[4]=地址>> 8;
    + Mac[3]=地址>> 16;
    + Mac[2]=地址>> 24;
    + Mac[1]=地址>> 32;
    + Mac[0]=地址>> 40;
    +
    +}
    +
    +void set_ETH_Mac_add (void)
    +{
    + struct udevice*dev1;
    + uchar mac_get1[6],mac_get2[6];
    + u64 u64macc_add;
    + int j=0,MAC_CNT=4;
    + char enetvar[32];
    +
    + i2c_Get_chip_of_busnum(0),0x50,6,&dev1);
    + dm_i2c_read(dev1, 0x00, mac_get1, 6);
    +
    如果(is_valid_ethaddr (mac_get1)){,则为+
    + u64macc_add = mac_to_u64 (mac_get1);
    +
    对于(j=0;j<MAC_CNT;j++){
    +
    + u64_to_Mac (u64macc_add,mac_get2);
    + sprintf (enetvar,"eth%daddr",j+1);
    + eth_env_set_enetaddr (enetvar,mac_get2);
    + u64macc_add = u64macc_add+1;
    +}
    +}
    +}
    +
    静态int probe_daughtercards(void)

    结构ti_am6_eeprom EP;
    @@-330,8 +378,8 @@静态int probe_daughtercards(void)
    Daugh_card_no_of_MAC_ADDR,
    &Mac_addr_cnt);
    如果(ret){
    - pr_err("读取0x%02x的子卡EEPROM失败%d\n",
    - i2c_addr,ret);
    +/* pr_err("读取0x%02x的子卡EEPROM失败%d\n",
    + i2c_addr,ret);*/
    /*
    *即使这非常严重,我们也跳过一下
    *此特定子卡,而不是结尾
    @@-402,6 + 450,9 @@ dflt:
    }

    #ifndef config_spL_build
    +
    + Set_Eth_Mac_add();
    +
    /*将设备树覆盖应用于U-Boot环境(如果有)*/
    如果(strlen(name_overles))
    返回env_set ("name_overlates",name_overlays);

    请告诉我是否需要对sd千 米8.2 进行任何其他更改,以便使用我的自定义EEPROM地址创建eth1addr,eth2addr,并将此MAC ID传递给Linux。

    谢谢!

    Sarfaraz  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,TI:

    上述问题的解决方案是什么?

    谢谢!

    Sarfaraz

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Sarfaraz,
    由于示例"i2c MD 0x50 0.2 50X100"用于在您的主板上使用SDK 8.2 读取EEPROM,
    您可以在“$u-boot/cmd/i2c.c”中查看匹配的DO-i2c_md()函数,以作为实现的参考。
    最佳,
    -洪

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢洪明都,我将尝试此操作,并在此处进行同样的更新。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Sarfaraz,
    是的,希望它对您自己的实施有所帮助...
    最佳,
    -洪