微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > 嵌入式系统设计讨论 > 嵌入式linux学习笔记20160808-每天进步一点点,向嵌入式进军-u-boot移植第一阶段

嵌入式linux学习笔记20160808-每天进步一点点,向嵌入式进军-u-boot移植第一阶段

时间:10-02 整理:3721RD 点击:

学习了几个字符设备驱动后,发现好像空中楼阁一样,理解无法深入,故将驱动学习先放一放,潜心研究下u-boot和linux内核。
首先是最底层的u-boot,先从移植学起,本次学习内容,u-boot第一阶段移植到mini2440(参考韦东山视频):
uboot版本:u-boot-2012.04.01
linux环境:ubuntu 14.04
gcc版本: arm-linux-gcc 4.3.2
SOC: S3C2440 CPU:arm920t
1.在根目录board.cfg添加目标板卡信息smdk2440,用来配置make smdk2440_config
smdk2440                     arm         arm920t     -                   samsung        s3c24x0
2.创建目标板卡目录和头文件:从board/samsung/smdk2410拷贝至board/samsung/smdk2440,include/configs/smdk2410.h拷贝至include/configs/smdk2440.h
make编译之后无输出
3.程序从start.S启动,arch/arm/cpu/arm920t/start.S分析
a.设置异常向量地址:
b.跳转到入口执行第一阶段初始化函数:start_code:
设置cpu工作在svc mode->重定位异常向量(针对AT91RM9200DK和AT91RM9200EK,故这段不执行)->关看门狗->关中断->设置时钟分频系数->跳转到cpu_init_crit->I/D cache使能->disable MMU stuff and caches(应该是关MMU,没太搞明白)->跳转lowlevel_init(board/samsung/smdk2410/lowlevel_init.S SDRAM初始化)->call_board_init_f(arch/arm/lib/board.c)很复杂,主要是分配SDRAM地址空间,然后重定位代码段->跳转到board_init_r(第二阶段代码)。
lowlevel_init函数中用到HCLK,此时MPLL还未设置,故SDRAM初始化失败,在设置时钟分频系数之后添加MPLL设置。
make编译烧录,输出乱码,解决办法:arch/arm/lib/board.c/board_init_r中找到serial_initialize,发现get_HCLK()中定义的是S3C2410,故在include/configs/smdk2440.h添加#define CONFIG_S3C2440 去掉#define CONFIG_S3C2410,编译后nand报错,去掉#define CONFIG_CMD_NAND,编译成功,串口输出正常

对,就应该从底层学起,不然总是空中楼阁的感觉

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top