我正在尝试使用OMAP L132调出自定义主板。 在“引导内核”之后,几乎所有时间都会在串行显示之前崩溃 我无法弄清楚导致log_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中初始化一些内容吗?
提前致谢, 阿瑞
答案 0 :(得分:1)
显然,在GPIO寄存器(或任何寄存器)可以轻松访问之前需要进行一些初始化。在调用rest_init函数之前,初始化和使用这些寄存器没有问题。
答案 1 :(得分:0)
首先,我建议你研究一下“earlyprintk”内核机制,它应该做的伎俩。如果它不适用于您的情况,请进一步阅读。
如果你想通过寄存器直接控制GPIO(比如在裸机应用程序中,即不使用内核GPIO框架),你应该做下面的事情:
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级别上调试内核。