使用GPIO(LED)进行启动板

时间:2014-11-30 21:07:43

标签: linux gpio

我正在尝试使用OMAP L132调出自定义主板。 在“引导内核”之后,几乎所有时间都会在串行显示之前崩溃 我无法弄清楚导致l​​og_buf(printk输出)崩溃的原因,所以我尝试(我还在尝试)使用我在船上的LED。 LED通过GPIO连接。据我所知,内核无法直接访问物理内存,我需要通过一些映射到内核虚拟地址。 但是,当我尝试在start_kernel函数中配置GPIO时,它会崩溃。 ioremap(...),gpio_direction_output(...)崩溃,有关SLUB的错误(无法分配内存节点-1; SLUB:Genslabs = 11,HWalign = 32,Order = 0-3,MinObjects = 0, CPU = 1,节点= 1) 我只是试图访问用于控制GPIO的寄存器,我在这里想念初始化? GPIO可以在内核中访问的最早点是什么?我应该在uboot中初始化一些内容吗?

提前致谢, 阿瑞

2 个答案:

答案 0 :(得分:1)

显然,在GPIO寄存器(或任何寄存器)可以轻松访问之前需要进行一些初始化。在调用rest_init函数之前,初始化和使用这些寄存器没有问题。

答案 1 :(得分:0)

首先,我建议你研究一下“earlyprintk”内核机制,它应该做的伎俩。如果它不适用于您的情况,请进一步阅读。

如果你想通过寄存器直接控制GPIO(比如在裸机应用程序中,即不使用内核GPIO框架),你应该做下面的事情:

  1. 启用GPIO模块的时钟(请参阅TRM中的“电源,复位和时钟管理”一章)
  2. 配置引脚多路复用器,使引脚(已连接到LEDS)连接到GPIO模块(参见TRM中的“控制模块”)
  3. 由于内核仅适用于虚拟地址,因此您需要使用ioremap()函数获取GPIO寄存器的虚拟地址
  4. 现在您应该可以使用iowrite32()和ioread32()宏与您在上一步重新映射的GPIO寄存器虚拟地址进行交互
  5. AFAIR,上述程序可以在您的SoC的TRM中的GPIO章节(更具体地,在“编程手册”子章节中)中找到。

    如果要使用内核GPIO框架,还需要确保首先正确配置时钟和多路复用器。接下来你应该找到你的SoC的GPIO驱动程序(类似这样:http://lxr.free-electrons.com/source/drivers/gpio/gpio-omap.c)并在你的配置中启用它(如果你的电路板使用defconfig,则必须默认启用)。现在,您只能在加载GPIO驱动程序时使用GPIO框架功能。正在使用postcore_initcall(级别2)探测“gpio-omap”驱动程序,因此您只能从下一级别的initcall开始使用它。 AFAIU,这在你的情况下是不够的,因为你试图在最早的initcall级别上调试内核。