在Cortex-M4 STM32F4上运行Linux 4.9(29I-DISC1)

时间:2016-12-25 14:31:03

标签: linux linux-kernel embedded-linux u-boot stm32f4

我花了几天时间试图理解,但我被卡住了。 我得到的只是一个"启动内核......"输入' bootm 8100000'在我的STM32F429I-DISC1板上。

在我从2011年到2016年更新uboot之前它是一个"起始内核......" + UNHANDED EXCEPTION HARDFAULT,但现在我只有#34; Starting Kernel ..."消息。

MCU是一个stm32F429,2MB Flash + ext。 8MB RAM。

Flash start addr 0x08000000 (uboot addr),我将内核放在 0x08100000 的第二个闪存库的开头。

外部8MB RAM的启动 0xD0000000

u-boot-2016.11似乎在那块板上跑得很好,bdi给我:

U-Boot > bdi
arch_number = 0x00000000
boot_params = 0xD0000100
DRAM bank   = 0x00000000
-> start    = 0xD0000000
-> size     = 0x00800000
current eth = unknown
ip_addr     = <NULL>
baudrate    = 115200 bps
relocaddr   = 0xD07D6000
reloc off   = 0xC87D6000
irq_sp      = 0xD05D3EE0
sp start    = 0xD05D3ED0
Early malloc usage: e0 / 400

这就是我构建内核的方式:

make CROSS_COMPILE=arm-none-eabi- ARCH=arm uImage LOADADDR=08100000 -B

这是bootm命令的完整输出:

U-Boot > bootm 8100000
## Booting kernel from Legacy Image at 08100000 ...
   Image Name:   Linux-4.9.0
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    839872 Bytes = 820.2 KiB
   Load Address: 08100000
   Entry Point:  08100000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK

Starting kernel ...

使用&#39; robutest&#39; /&#39; emcraft&#39; kernel / config文件我得到了相同的日志,除非入口点看起来更正确,因为它是08100001。

在robutest / emcraft内核上,我试图激活电路板的LCD屏幕,但没有任何反应。

在我的所有测试中,我都激活了内核配置&#34;早期的printk&#34;和&#34; DEBUG_LL_xxx&#34;东西。

这是我的.config文件的链接: http://pastebin.com/gBNYx3Gs

PS:我尝试使用uCLinux emcraft / robutest尝试查找正在进行的操作,但我的主要目标是运行Linux 4.9。

感谢您阅读!!!

编辑:我试图传递dtb&#34;旧方式&#34;,但结果相同:

U-Boot > bootm 08100000 - 08040000                                                                            
## Booting kernel from Legacy Image at 08100000 ...                                                           
   Image Name:   Linux-4.9.0                                                                                  
   Image Type:   ARM Linux Kernel Image (uncompressed)                                                        
   Data Size:    805744 Bytes = 786.9 KiB                                                                     
   Load Address: 08100000                                                                                     
   Entry Point:  08100000                                                                                     
   Verifying Checksum ... OK                                                                                  
## Flattened Device Tree blob at 08040000                                                                     
   Booting using the fdt blob at 0x8040000                                                                    
   Loading Kernel Image ... OK                                                                                
   Loading Device Tree to d05ce000, end d05d2a9f ... OK                                                       

Starting kernel ...                                                                                           

我绝望,欢迎任何想法:&#39;(

EDIT2:我试图用u-boot解压缩内核,它是一样的:

U-Boot > bootm 8100000 - 8040000
## Booting kernel from Legacy Image at 08100000 ...
   Image Name:   uImage
   Image Type:   ARM Linux Kernel Image (gzip compressed)
   Data Size:    940696 Bytes = 918.6 KiB
   Load Address: d0008000
   Entry Point:  d0008001
   Verifying Checksum ... OK
## Flattened Device Tree blob at 08040000
   Booting using the fdt blob at 0x8040000
   Uncompressing Kernel Image ... OK
   Loading Device Tree to d05ce000, end d05d2a9f ... OK

Starting kernel ...

EDIT3:我检查了dtb中的内存/ USART1地址,没问题。为什么我没有内核消息?

EDIT4:使用uxipImage:

U-Boot > bootm 08060000 - 08040000
## Booting kernel from Legacy Image at 08060000 ...
   Image Name:   uxipImage
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    1497396 Bytes = 1.4 MiB
   Load Address: 08060000
   Entry Point:  08060041
   Verifying Checksum ... OK
## Flattened Device Tree blob at 08040000
   Booting using the fdt blob at 0x8040000
   Loading Kernel Image ... OK
   Loading Device Tree to d05ce000, end d05d2a9f ... OK

Starting kernel ...

我尝试使用不同的入口点,08060000,08060040和08060041。

2 个答案:

答案 0 :(得分:3)

我找到了!

感谢亚历山大,UART的诀窍就像魅力一样!!!! 谢谢你,第一次尝试在嵌入式系统中破解内核,感谢你学到了很多东西。

对于那些有这个问题的人,对我来说就是XIP_PHYS_ADDR! 不要忘记64字节的标题!!

我正在闪烁XIP内核@ 0x08060000,所以XIP_PHYS_ADDR(和引导条目顺便说一下)它是0x08060040 !!!!

再次感谢alexander !!

答案 1 :(得分:1)

我遇到过同样的问题,但原因不同。问题出现在存储u-boot structure field的{​​{1}}的{​​{1}}之一size未填充此字段的未压缩大小,uncompressed linux kernel.稍后用于调整其u-boot的大小,从而使系统处于未定义状态。

一旦linux kernel打印stack消息,在u-boot为内核传输u-boot以接管执行后,下一条消息应为Starting kernel...,并且也许Uncompressing Linux... done, booting the kernel正在寻找这个领域。如果您正在使用基于SMM Handler的系统,则解压缩将位于以下文件目录中:

kernel

解决方案是使用最新的u-boot foun:https://github.com/andy-shev/u-boot

但是,如果您使用自定义u-boot,则需要查找此字段。