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/processor-SDK-AM335X:GPIO OE 寄存器读取问题

Guru**** 2589280 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/640217/linux-processor-sdk-am335x-gpio-oe-register-read-issue

器件型号:PROCESSOR-SDK-AM335X

工具/软件:Linux

使用具有双以太网 PHY 的 Beagle Bone Black 衍生板。  ETH_RESET 由 GPIO_0_29驱动、在 u-boot 中设置为输出。  U-boot 也会正确复位 PHY。

也有
GPIO0{&gpio0}
    pinctrl-names ="default";
    pinctrl-0 =<&GPIO0_PINS_DEFAULT>;
    状态="正常";

    ETH_RESET{
        GPIO-hog;
        GPIO =<29 GPIO_ACTIVE_HIGH_>;
        输出低电平;
        线路名称="ETH_RESET";
    };
};

但是、这在 drivers/net/ti/davinci_mdio.c 之后进行处理、并且一些内核代码将所有 GPIO 引脚翻转回输入。  当前电路板在 GPIO_0_29上有上拉电阻、这会导致 PHY 在驱动器查找 PHY 时保持复位状态。  因此、尝试跟踪在内核中完成此操作的位置。  在 init/main.c 中添加了以下内容、以验证从 u-boot 到 GPIO_0_29仍处于正确状态。

  void __iomem *GPIO0_BASE = NULL;
  void __iomem *GPIO3_base = NULL;

  GPIO0_BASE = ioremap ((unsigned int) 0x44E07000、4096);
  GPIO3_base = ioremap ((unsigned int) 0x481AE000、4096);

  PR_NOTICE ("START_kernel:GPIO0_Oe=%0x、GPIO3_Oe=%0x、GPIO0_dataout=%0x、GPIO3_dataout=%0x\n"、
       _raW_readl (GPIO0_BASE + 0x134)、__raW_readl (GPIO3_base + 0x134)、
       _raW_readl (GPIO0_BASE + 0x13C)、__raW_readl (GPIO3_base + 0x13C);

  iounmap (GPIO0_BASE);
  iounmap (GPIO3_base);

这可以正常工作、但当我在其他位置复制此代码时、例如 drivers/pinctrl/core.c、我将卡在
正在启动内核...

有什么想法为什么?

 

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

    Linux 内核可能未设置 GPIO 功能时钟、这会阻止读取 GPIO0_OE、GPIO3_OE、GPIO0_dataout 和 GPIO3_dataout 寄存器。

    您能否共享您的引导日志、以便我们可以检查它?

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

    当我在 start_kernel()方法中的 init/main.c 中插入代码片段时,我包含的代码片段会正常工作。  请参阅以下日志中突出显示的文本。  即启用 GPIO 模块(时钟正在运行等)。
    我的问题是、当我在 drivers/pinctrl/core.c 中复制此代码片段时、此代码片段是否可以正常工作?  因为当我这么做时、当 u-boot 启动内核时、系统就会挂起。
    即我得到的最后一个日志是

    (笑声)
    正在启动内核...

    下面的工作日志:

    U-Boot SPL 2017.01 (2017年11月12日- 20:15:29)
    尝试从 MMC1MMC 分区交换机引导失败
    ***警告-使用默认环境时 MMC 分区交换机出现故障

    正在读取 u-boot.img
    正在读取 u-boot.img


    U-Boot 2017.01 (2017年11月12日- 20:15:29 +0000)

    CPU:AM335X-GP 修订版2.1
    I2C:就绪
    DRAM:512 MiB
    MMC:OMAP SD/MMC:0、OMAP SD/MMC:1.
    卡未响应电压选择!
    ***警告- MMC 初始化失败,使用默认环境

    未设置。 验证第一个电子保险丝 MAC
    NET:cpsw、USB_ether
    按空格键可在2秒钟内中止自动引导
    切换到分区#0,确定
    mmc0是当前器件
    在器件0上找到 SD/MMC
    正在读取 BOOT.SCR
    **无法读取文件 boot.scr **
    正在阅读 uEnv.txt
    **无法读取文件 uEnv.txt **
    切换到分区#0,确定
    mmc0是当前器件
    正在扫描 MMC 0:1...
    切换到分区#0,确定
    mmc0是当前器件
    在器件0上找到 SD/MMC
    在368ms (14.1 MIB/s)内读取5430432字节
    在28ms 内读取34386字节(1.2 MIB/s)
    ###展开的设备树 blob、88000000
    使用0x88000000处的 FDT blob 进行引导
    正在将设备树加载到8fff4000,结束8ff651... 好的

    正在启动内核...

    在物理 CPU 0x0上引导 Linux
    正在初始化 cgroup Subsys cpuset
    正在初始化 cgroup Subsys CPU
    正在初始化 cgroup Subsys cpuacct
    Linux 版本4.4.8.87-Yocto 标准(OE-USER@OE-HOST)(gcc 版本6.3.0 (GCC))#1抢先于 UTC 2017年11月16日04:03:17
    CPU:ARMv7处理器[413fc082]修订版2 (ARMv7)、CR=10c5387d
    CPU:PIPT/VIPT 非混叠数据高速缓存、VIPT 别名指令高速缓存
    机器模型:TI AM335x BeagleBone DNI
    CMA:保留0x9e800000处的16 MIB
    内存策略:数据高速缓存写回
    CPU:所有 CPU 在 SVC 模式中启动。
    AM335x ES2.1 (SGX NEON)
    在区域顺序和移动分组中构建1个区域列表。 总页数:129664
    内核命令行:console=ttyO0、115200n8 root=PARTUUID =08ffb82b-02 rw rootfstype=ext4 rootwait
    PID 哈希表条目:2048 (顺序:1、8192字节)
    DEntry 高速缓存哈希表条目:65536 (顺序:6、262144字节)
    inode 高速缓存散列表条目:32768 (顺序:5、131072字节)
    内存:488928K/523264K 可用(8214K 内核代码、706K rwdata、2528K rodata、560K init、633K BSS、 17952K 保留、16384K CMA 保留、0K HIGHMEM)
    虚拟内核内存布局:
    向量:0xff0000-0xff1000 (4KB)
    Fixmap:0xc00000 - 0xc00000 (3072 KB)
    vmalloc:0xe0800000 - 0x0x800000 (496MB)
    低内存:0xC0000000 - 0xe0000000 (512 MB)
    pkmap:bfe00000 - 0xC0000000 (2 MB)
    模块:bbf000000 - bbfe00000 (14 MB)
    .text:0xc0008000 - 0xc0a85c3c (10744KB)
    init:0xc0a86000 - 0xc0b12000 (560 KB)
    .data:0xc0b12000-0xc0bc295c (707KB)
    .bss:0xc0bc5000 - 0xc0c63650 (634KB)
    slub:HWalign=64、order=0-3、MinObjects=0、CPU=1、Nodes=1
    可抢占的分层 RCU 实现。
    叶片扇出的构建时间调整为32。
    nr_IRQ:16 nr_IRQ:16 16.
    IRQ:在0xfa200000 (修订版本5.0)上找到一个带有128个中断的 INTC
    OMAP 时钟事件源:timer2为24000000 Hz
    SCHED_CLOCK:24MHz 时为32位、分辨率41ns、每89478484971ns 换行一次
    时钟源:Timer1:屏蔽:0xFFFFFFFF max_cycles:0xFFFFFFFF、max_idle_ns:79635851949 ns
    OMAP 时钟源:Timer1为24000000 Hz
    clocksource_probe:未找到匹配的时钟源
    控制台:彩色虚拟设备80x30
    正在校准延迟环路... 996.14茂物剪(lpj=4980736)
    PID_max:默认值:32768最小值:301
    已初始化安全框架
    挂载高速缓存哈希表条目:1024 (顺序:0、4096字节)
    mountpoint-cache 哈希表条目:1024 (顺序:0、4096字节)
    正在初始化 cgroup Subsys IO
    正在初始化 cgroup Subsys 内存
    正在初始化 cgroup Subsys 设备
    正在初始化 cgroup Subsys frecr冰箱
    正在初始化 cgroup Subsys net_cls
    正在初始化 cgroup Subsys 调试
    start_kernel:gpio0_OE=dffffff、gpio3_OE=fffffffffb、gpio0_dataout=0、gpio3_dataout=4
    CPU:测试写入缓冲区一致性:好的
    ftrace:在82页中分配27666个条目
    为0x80008200-0x80008258设置静态标识映射
    devtmpfs:已初始化
    VFP 支持 v0.3:实施者41架构3第30部分变体 c 修订版3
    omap_hwmod:tptc0使用 EDMA 中断开的 dt 数据
    omap_hwmod:tptc1使用 EDMA 中断开的 dt 数据
    omap_hwmod:tptc2使用 EDMA 中断开的 dt 数据
    omap_hwmod:debugss:_wait_target_disable 失败
    时钟源:Jiffies:MASK:0xFFFFFFFF max_cycles:0xFFFFFFFF、max_idle_ns:19112604462750000 ns
    futex 哈希表条目:256 (顺序:-1、3072字节)
    XOR:测量软件校验和速度
    arm4regs:1202.000 MB/秒
    8regs:892.800 MB/秒
    32regs:1156.800 MB/秒
    XOR:使用函数:arm4regs (1202.000 MB/秒)
    pinctrl 内核:已初始化的 pinctrl 子系统
    NET:注册协议系列16.
    DMA:预分配256 KiB 池、用于原子相干分配
    空闲:使用调速器梯
    空闲:使用调速器菜单
    OMAP-GPIO 44e07000.GPIO:找不到节点/ocp/l4_wkup@44c00000/SCM@210000/引脚多路复用@800/GPIO0_PINS_DEFAULT 的 pctldev、推迟探针
    OMAP-GPIO 4804c000.GPIO:找不到节点/ocp/l4_wkup@44c00000/CSCM@210000/ pinmux@800/GPIO1_PINS_DEFAULT 的 pctldev、推迟探针
    OMAP-GPIO 481ac000.GPIO:找不到节点/ocp/l4_wkup@44c00000/CSCM@210000/引脚多路复用@800/GPIO2_PINS_DEFAULT 的 pctldev、推迟探针
    OMAP-GPIO 481ae000.GPIO:找不到节点/ocp/l4_wkup@44c00000/SCM@210000/ pinmux@800/GPIO3_PINS_DEFAULT 的 pctldev、推迟探针
    硬件断点:不支持调试架构0x4。
    RAID6:int32x1 gen() 209 MB/s
    RAID6:int32x1 XOR() 142 MB/s
    RAID6:int32x2 gen() 226 MB/s
    RAID6:int32x2 XOR() 162 MB/s
    RAID6:int32x4 gen() 209 MB/s
    RAID6:int32x4 XOR() 136 Mb/s
    RAID6:int32x8 gen() 175 Mb/s
    RAID6:int32x8 XOR() 118 Mb/s
    RAID6:使用算法 int32x2 gen() 226 MB/s
    RAID6: XOR() 162 Mb/s,RMW 已启用
    RAID6:使用 intx1恢复算法
    EDMA 49000000.EDMA:启用了传统 memcpy、但可能无法正常工作
    EDMA 49000000.EDMA:TI EDMA DMA 引擎驱动程序
    已初始化 SCSI 子系统
    usbcore:注册的新接口驱动程序 usbfs
    usbcore:注册的新接口驱动程序集线器
    usbcore:注册了新设备驱动程序 USB
    omap_i2c 44e0b000.i2c:找不到节点/ocp/l4_wkup@44c00000/SCM@210000/ pinmux@800/pinmux_i2c0_pins 的 pctldev、延迟探针
    omap_i2c 4819c000.i2c:找不到节点/ocp/l4_wkup@44c00000/SCM@210000/ pinmux@800/pinmux_i2c2_pins 的 pctldev、延迟探针
    时钟源:切换到时钟源定时器1
    NET:注册协议系列2.
    TCP 建立哈希表条目:4096 (顺序:2、16384字节)
    TCP 绑定哈希表条目:4096 (顺序:2、16384字节)
    TCP:配置哈希表(建立4096 BIND 4096)
    UDP 哈希表条目:256 (顺序:0、4096字节)
    UP-Lite 哈希表条目:256 (顺序:0、4096字节)
    NET:注册协议系列1
    RPC:注册后命名为 UNIX 套接字传输模块。
    RPC:注册的 UDP 传输模块。
    RPC:注册的 TCP 传输模块。
    RPC:已注册的 TCP NFSv4.1反向通道传输模块。
    硬件性能事件:通过 armv7_cortex_A8 PMU 驱动器启用、提供5个计数器
    NFS:注册 id_resolver 密钥类型
    注册的密钥类型 id_resolver
    注册的密钥类型 id_legacy
    块层 SCSI 通用(BSG)驱动程序0.4版已加载(主要252)
    已注册 IO 调度程序 NOOP
    已登记 IO 调度程序截止日期
    已注册 IO 调度程序 cfq (默认)
    pinctrl-single 44e10800.pinmux:142引脚、PA f9e10800、尺寸568
    OMAP-UART 44e09000.serial: uart0无 wakeirq
    MMIO 0x44E09000 (IRQ = 27、BASE_BAUD = 3000000)上的44e09000.serial: ttyO0是 OMAP UART0
    控制台[ttyO0]已启用
    [DRM]已初始化 DRM 1.1.0 20060810
    返修:模块已加载
    mtdoops:必须提供 MTD 器件(mtddev=name/number)
    DaVinci_MDIO 4a101000.MDIO:达芬奇 MDIO 修订版本1.6
    DaVinci_MDIO 4a101000.MDIO:无实时 phy、可扫描全部
    DaVinci_MDIO:4a101000.MDIO 的探测失败、错误-5
    cpsw 4a100000.以太网:检测到的 MACID = 38:D2:69:55:43:02
    cpsw 4a100000.ethernet:cpsw:检测到的 MACID = 38:D2:69:55:43:04
    usbcore:注册的新接口驱动程序 kawith

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

    为清楚起见、这里是代码片段。  这是否应该在内核空间的任何位置都能正常工作?

    void __iomem *GPIO0_BASE = NULL;
    void __iomem *GPIO3_base = NULL;
    
    GPIO0_BASE = ioremap ((unsigned int) 0x44E07000、4096);
    GPIO3_base = ioremap ((unsigned int) 0x481AE000、4096);
    
    PR_NOTICE ("START_kernel:GPIO0_Oe=%0x、GPIO3_Oe=%0x、GPIO0_dataout=%0x、GPIO3_dataout=%0x\n"、
    _raW_readl (GPIO0_BASE + 0x134)、__raW_readl (GPIO3_base + 0x134)、
    _raW_readl (GPIO0_BASE + 0x13C)、__raW_readl (GPIO3_base + 0x13C);
    
    iounmap (GPIO0_BASE);
    iounmap (GPIO3_base);
    
    

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

    此代码应在内核空间中正常运行。 但是、正如我说过的、如果您尝试读取 GPIO 地址空间、在内核启用 GPIO 时钟之前、这将失败并出现总线错误。 我建议读取相关的 PRCM 寄存器(CM_PER_GPIO3_CLKCTRL 和 CM_WKUP_GPIO0_CLKCTRL)、以查看是否启用 GPIO 功能时钟、然后如果 GPIO 时钟正在运行、对 OE 和 DATAOUT 寄存器执行读取操作。

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

    感谢 Yordan 的指导。  GPIO 模块被禁用。  使能它们、并且能够访问 GPIO 寄存器。