ARM_s5pv210_porting_2
来源:互联网 发布:cvr100身份证阅读软件 编辑:程序博客网 时间:2024/06/05 04:28
Linux系统移植
引导程序(u-boot.bin)
操作系统内核(zImage)
文件系统(rootfs.cramfs)
u-boot
u-boot.lds
start.S
PC = C3E00214
PC-4 = C3E00210
start.S第一阶段
1.改模式SVC,屏蔽中断
2.初始化硬件,s5pv210处理器中控制器(系统时钟,SDRAM控制器,UART控制器,NandFlash控制器)
3.将整个u-boot.bin从NandFlash拷贝到SDRAM中
4.开启MMU
5.建栈
6.清BSS段
7.跳转到start_armboot函数去执行(c语言函数)
source insight工具
用source insight建工程
board.c
start_armboot()
typedey int (init_fnc_t)(void);
//定义了一个名为init_fnc_t函数类型,该函数的返回值为int,参数为void
typedef struct global_data { bd_t *bd; unsigned long flags; unsigned long baudrate; unsigned long have_console; /* serial_init() was called */ unsigned long reloc_off; /* Relocation Offset */ unsigned long env_addr; /* Address of Environment struct */ unsigned long env_valid; /* Checksum of Environment valid? */ unsigned long fb_base; /* base address of frame buffer */#ifdef CONFIG_VFD unsigned char vfd_type; /* display type */#endif#if 0 unsigned long cpu_clk; /* CPU clock in Hz! */ unsigned long bus_clk; phys_size_t ram_size; /* RAM size */ unsigned long reset_status; /* reset status register at boot */#endif void **jt; /* jump table */} gd_t;
typedef struct bd_info { int bi_baudrate; /* serial console baudrate */ unsigned long bi_ip_addr; /* IP Address */ unsigned char bi_enetaddr[6]; /* Ethernet adress */ struct environment_s *bi_env; ulong bi_arch_number; /* unique id for this board */ ulong bi_boot_params; /* where this board expects params */ struct /* RAM configuration */ { ulong start; ulong size; } bi_dram[CONFIG_NR_DRAM_BANKS];#ifdef CONFIG_HAS_ETH1 /* second onboard ethernet port */ unsigned char bi_enet1addr[6];#endif} bd_t;
两个重要的数据结构:
gd_t:用来保存uboot的全局信息的结构体
bd_t:是gd_t的成员,用于描述开发板的相关信息
gd变量的地址存放在r8,由于r8是s5pv210处理器的寄存器,所以访问速度快,提高访问效率。
int board_init(void){ DECLARE_GLOBAL_DATA_PTR;#ifdef CONFIG_DRIVER_SMC911X smc9115_pre_init();#endif#ifdef CONFIG_DRIVER_DM9000 dm9000_pre_init();#endif//网卡初始化,可以通过修改宏的定义,通样也能实现移植代码的功能 gd->bd->bi_arch_number = MACH_TYPE;//MACH_TYPE = 2456 //2456是开发板的ID号 gd->bd->bi_boot_params = (PHYS_SDRAM_1+0x100); //PHYS_SDRAM_1 = 0x20000000 //uboot向内核传递的参数的地址 return 0;}
int dram_init(void){ DECLARE_GLOBAL_DATA_PTR; gd->bd->bi_dram[0].start = PHYS_SDRAM_1;//0x2000 0000 gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;//0x2000 0000(512MB)#if defined(PHYS_SDRAM_2) gd->bd->bi_dram[1].start = PHYS_SDRAM_2;//0x2000 0000 + 0x2000 0000 gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE;//0x2000 0000 //将外接内存的具体地址做初始化#endif return 0;}
for (;;) { main_loop (); }
tarena# printenv
tarena# printenv bootdelay
u-boot两种模式:
下载更新模式:在系统处于研发阶段
启动加载模式:产品发布阶段
u-boot的环境变量
bootdelay:
1.在bootdelay秒内,敲击空格,系统进入:
tarena# tftp 20008000 zImage
tarena# nand erase 500000 500000
tarena#nand write 20008000 500000 500000
2.在bootdelay秒内,没有敲击空格,系统将会执行bootcmd环境变量中的命令
bootcmd=tftp 20008000 zImage;bootm 20008000
tftp 20008000 zImage;//将服务器端/tftpboot/目录下的zImage内核文件下载到开发板的内存的20008000地址
bootm 20008000
bootm就是在启动内核
start.S(启动初始化)
board.c(各种硬件初始化函数)
main_loop:
bootdelay
bootcmd
bootdelay:有键盘输入,进入到下载更新模式,tarena#。无键盘输入,进入启动加载模式,执行bootcmd环境变量中命令:tftp 20008000 zImage;bootm 20008000
u-boot命令:
print/printenv:用于打印当前uboot下的环境变量
tarena#print
tarena#print bootdelay
setenv:设置环境变量
tarena#setenv bootdelay 10
tarena#setenv serverip 192.168.1.10//设置服务器IP
tarena#saveenv/save:保存环境变量
tftp:通过tftp服务从服务器端的/tftpboot目录下载共享文件
tarena#tftp 20008000 shell.bin
go:执行内存中的二进制代码
tarena#go 20008000
bootm:执行内存中的操作系统文件
nand erase:擦除Nand Flash的命令
tarena#nand erase 500000 500000
nand write:烧写Nand Flash命令
tarena#tftp 20008000 zImage
tarena#nand write 20008000 500000 500000
nand read:读Nand Flash命令
tarena#setenv bootcmd nand read 20008000 500000 500000;/从Nand Flash的5M地址开始,读5M的内容,读到内存的20008000地址/bootm 20008000/系统开发完毕**/
u-boot如何定义命令?
U_BOOT_CMD( go, CFG_MAXARGS, 1, do_go, "go - start application at address 'addr'\n", "addr [arg ...]\n - start application at address 'addr'\n" " passing 'arg' as arguments\n");extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);U_BOOT_CMD( reset, 1, 0, do_reset, "reset - Perform RESET of the CPU\n", NULL);U_BOOT_CMD( re, 1, 0, do_reset, "reset - Perform RESET of the CPU\n", NULL);
bootcmd环境变量
tftp 20008000 zImage\;bootm 20008000
do_bootm函数启动内核(内核启动功能)
2456:开发板的ID号
0x20000100:uboot传递给内核启动参数存放的地址
////////////////////////////////////////////////
u-boot.bin的启动过程:
1.start.S->前8KB代码在CPU内部的IRAM中执行(位置无关码,用b或者bl指令,动态计算跳转的地址)
2.lowlevel_init.S->s5pv210处理器内部硬件初始化,包括关闭看门狗,系统时钟,初始化SDRAM控制器,UART控制器,Nand Flash控制器
3.start.S->通过代码将整个u-boot.bin拷贝到SDRAM中0x23e00000,开启MMU,建栈,清bss段,使用了伪指令ldr pc_start_armboot跳转至SDRAM去执行剩下的代码。
4.uboot的第二阶段start_armboot,此函数是C函数,执行了一系列的硬件初始化函数:
board_init(初始化网卡DM9000,开发板的ID号,uboot传递给内核启动参数的地址)
dram_init(将物理内存的地址进行了初始化)
5.main_loop->
判定bootdelay和bootcmd环境变量
当bootdelay秒内,有键盘输入,进入下载更新模式。
当bootdelay秒内,无键盘输入,进入启动加载模式:执行bootcmd环境变量中的命令:tftp 20008000 zImage;bootm 20008000//启动内核
6.bootm命令调用该命令对应的命令处理函数do_bootm
7.do_bootm调用do_bootm_linux函数
8.do_bootm_linux调用theKernel(0,2456,0x20000100)调用内核
/////////////////////////////////////////////////////////////
配置u-boot
make CW210_config
编译u-boot
make
烧写系统
配置环境变量:
bootcmd
bootargs console=ttySAC0
文件系统
…/rootfs
- ARM_s5pv210_porting_2
- Struts2中的值栈和OGNL
- Android:通知随记1
- 白手起家学习数据科学 ——k-Nearest Neighbors之“例子篇”(九)
- 51nod 1451:合法三角形 枚举斜率
- iOS开发之4种存储方式
- ARM_s5pv210_porting_2
- A+B for Input-Output Practice (VIII)(没啥用,来凑数)
- 4-5 求自定类型元素的最大值
- mysql 批量insert
- AnimTextView
- 与调试器共舞 - LLDB 的华尔兹
- JavaScript 初识
- 工具之OpenGrok的搭建方法
- [MySQL] 实例讲解MYSQL数据库的查询优化技术