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
这里写图片描述

0 0
原创粉丝点击