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.

[参考译文] Linux/TMS320DM8148:I2C #1可在 Linux 中工作-但不能在 u-boot 中工作?

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/570162/linux-tms320dm8148-i2c-1-works-in-linux---but-not-in-u-boot

器件型号:TMS320DM8148

工具/软件:Linux

您好!

我在 u-boot 尝试访问总线#1时遇到一些问题。

函数 i2c_set_fbus_num 卡死了,我不明白为什么。

是否有人熟悉这一点?

RET = i2c_set_bus_num (1);

<<---- 永远不会来这里
 IF (RET)
   printf ("更改总线编号(%d)失败\n"、ret);

它在 i2c_set_bus_num->i2c_init->中挂起

  printf ("i2c_init 8\n");

BUS_initialized [CURRENT_BUS]= 1;
if (readw (I2C_CON)& I2C_CON_EN){
writew (0、I2C_CON);
udelay (50000);

writew (PSC、I2C_PSC);
writew (scll、I2C_SCLL);
writew (sclh、I2C_SCLH);

/*自有地址*/
writew (slaveadd、I2C_OA);
writew (I2C_CON_EN、I2C_CON);

  printf ("i2c_init 9\n"); <--- 从不打印..........

此致、

已运行

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

    您是否尝试从内核访问 I2C1? 它是否起作用?

    您可能需要使用 I2C_SYSC 重置 I2C 模块并检查一次(仅用于测试)。

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

    是的。 它可以从 Linux 运行、但不能从 u-boot 运行。

    它可能与 u-boot 配置文件中的配置有关?
    我尝试了一些变体、但没有什么帮助。

    # define CONFIG_CMD_I2C
    # define CONFIG_HARD_I2C 1
    # define CONFIG_SYS_I2C_SPEED 100000
    # define CONFIG_SYS_I2C_SLAVE 1
    # define CONFIG_SYS_I2C_BUS 0
    # define CONFIG_SYS_I2C_BUS_SELECT 1.
    # define CONFIG_DRIVER_TI81XX_I2C 1.
    # define CONFIG_I2C_MULTI_BUS 1
    //CONFIG_I2C_MUX
    //CONFIG_I2C_MULTI_BUS

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

    RAN、

    只需猜测、这可能是因为无法为您的平台正确配置 I2C 基址。

    是否可以检查 PSC 底座并进行验证?

    谢谢

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

    您好!

    从 DM8148数据表:

    0x4802_8000 0x4802_8FFF 0x0802_8000 0x0802_8FFF 4KB I2C0外设寄存器

    0x4802_9000 0x4802_9FFF 0x0802_9000 0x0802_9FFF 4KB I2C0支持寄存器

    0x4802_A000 0x4802_AFF 0x0802_A000 0x0802_AFF 4KB I2C1外设寄存器

    0x4802_B000 0x4802_BFFF 0x0802_B000 0x0802_BFFF 4KB I2C1支持寄存器

    网址为/asm/arch-ti81xx i2c.h

    #define I2C_BASE1  0x48028000

    #define I2C_BASE2  0x4802A000

    #define I2C_BASE3 0x4819C000

    #define I2C_BUS_MAX 3.

    u32 i2c_base = I2C_BASE1

    #define I2C_DEFAULT_BASE  i2c_base

    因此、它似乎与数据表偏移相匹配。

    我还重新检查了引脚多路复用、找不到任何问题:

    MUX_VAL (PINCNTL78,(IEN | IPU | FCN1))/* I2C[1]_SCL */\

    MUX_VAL (PINCNTL79,(IEN | IPU | FCN1))/* I2C[1]_SDA */\

    MUX_VAL (PINCNTL263,(IEN | IPU | FCN1))/* I2C[0]_SCL */\

    MUX_VAL (PINCNTL264,(IEN | IPU | FCN1))/* I2C[0]_SDA */\

    我还重新检查了 ti814x 的配置文件:

    # define CONFIG_CMD_I2C

    # define CONFIG_HARD_I2C       1

    # define CONFIG_SYS_I2C_SPEED   100000

    # define CONFIG_SYS_I2C_SLAVE   1.

    # define CONFIG_SYS_I2C_BUS  0

    # define CONFIG_SYS_I2C_BUS_SELECT 1.

    # define CONFIG_DRIVER_TI81XX_I2C 1.

    # define CONFIG_I2C_MULTI_BUS      1

     

    它可能与 EEPROM 相关(但 EEPROM 位于总线#0中)

    #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2.
    #define CONFIG_SYS_I2C_EEPROM_ADDR 0x50
    #define CONFIG_SYS_I2C_MULTI_EEPROMS

    #define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 7.
    #define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS 20.

    #define CONFIG_CMD_EEPROM

    感谢您的任何想法。

    已运行

     

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

    您好!

    还有一个,

    添加后

    # define CONFIG_I2C_MULTI_BUS      1

    我可以从 u-boot 提示符执行以下操作:

    >i2c dev 0

    >i2c DEV 2.

    但在尝试时

    >i2c DEV 1.

    U-boot 挂起...

    是否有人可以尝试查看 dm814x 是否遇到相同的问题?

    此致、

    已运行

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

    您使用的是哪种软件? EZSDK/IPNC RDK 等 u-boot 版本是什么?

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

    我正在使用 RDK。

    我的 CPU 有问题、无法使用 i2c 1、但可以使用 i2c 0、2:

    以下是我的 i2c1代码中的相关修改:

    /ti8148/evm.v


    _raW_writel (0x2、CM_ALWON_I2C_0_CLKCTRL);
    while (__raW_readl (CM_ALWON_I2C_0_CLKCTRL)!= 0x2);

    + _raW_writel (0x2、CM_ALWON_I2C_1_CLKCTRL);
    + while (__raW_readl (CM_ALWON_I2C_1_CLKCTRL)!= 0x2);
    +

    /include/configs/ti8148_evm.h


    # define CONFIG_SYS_I2C_BUS 0
    # define CONFIG_SYS_I2C_BUS_SELECT 1
    # define CONFIG_DRIVER_TI81XX_I2C 1
    ##定义 CONFIG_I2C_MULTI_BUS 1
    #endif

    但是、接下来要做的是:
    i2c 开发1

    它被卡住了…

    我记得它曾经起作用过。 它是否是由更新的 dm814x 修订版负责?

    在 Linux 中工作正常。

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

    [引用 user="ran Shalit"]

    我可以从 u-boot 提示符执行以下操作:

    >i2c dev 0

    >i2c DEV 2.

    但在尝试时

    >i2c DEV 1.

    U-boot 挂起...

    [/报价]

    RAN、

    默认情况下、我们在 u-boot 中启用了 i2c0 (0x48028000)和 i2c2 (0x4819C000)。 关于 i2c1 (0x4802A000)、您应该启用它。

    此致、
    帕维尔

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

    你好,Pavel

    我已按照上述消息中所述启用它。

    启用 i2c1是否需要进行任何其他更改

    此致

    已运行

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

    此外、"i2c dev"在 ti81xx u-boot 中不可用。 检查 i2c -h 可用的选项

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

    在使用 i2c 之前、我已通过强制执行 i2c 来解决此问题。
    奇怪的是、在 u-boot 中启动时启用了 i2c:

    void per_clocks_enable (void)


    _raW_writel (0x2、CM_ALWON_I2C_1_CLKCTRL);
    while (__raW_readl (CM_ALWON_I2C_1_CLKCTRL)!= 0x2);


    为什么在从 u-boot 提示符(u-boot 提示符)调用例程之前,它在中间被禁用? 不确定。

    但是、使用此权变措施可以正常工作。

    谢谢、
    已运行