fs4412开发板学习笔记(五)
2015-10-27 23:29
260 查看
一、建立自己的平台
二、实现能看到串口终端信息
1.确认第一条指令有运行到(点灯法)
2.实现串口输出
(1)修改lowlevel_init.S文件
三、FLSAH移植(EMMC)
1.初始化emmc
/++++++++++++++++++++++++/
修改board_mmc_init为如下:
在末尾添加:
2.添加相关命令:
添加驱动:
3.添加EMMC相关配置
vim include/configs/fs412.h
添加:
4.内存适配
确定板子内存大小,如果是2G的,那么需要修改如下代码:
vim include/configs/fs4412.h
修改
注意:如果该板子是1G却配置成2G将会发生如下问题:
U-Boot 2013.01 (Aug 24 2014 - 12:01:19) for FS4412
CPU: Exynos4412@1000MHz
Board: FS4412
DRAM: 2 GiB //启动的时候卡在这里就没反应了
四、网卡移植
1.添加网络初始化代码
vim board/samsung/fs4412/fs4412.c
在struct exynos4_gpio_part2 *gpio2;后添加:
2.修改配置文件添加网络相关配置
include/configs/fs4412.h:
1.指定交叉编译工具 vim Makefile 在 ifeq ($(HOSTARCH),$(ARCH)) CROSS_COMPILE ?= endif 的下面增加 ifeq (arm,$(ARCH)) CROSS_COMPILE ?=arm-none-linux-gnueabi- endif 2.指定产品CPU 我们的产品是exynos4412 查看u-boot源码 arch/arm/cpu/armv7/exynos/ 可知U-boot已经支持。 3.指定产品的BOARD 找一个类似的board配置修改,这里参考的是board/samsung/origen/ cp -rf board/samsung/origen/ board/samsung/fs4412 mv board/samsung/fs4412/origen.c board/samsung/fs4412/fs4412.c vim board/samsung/fs4412/Makefile 修改origen.o为fs4412.o cp include/configs/origen.h include/configs/fs4412.h vim include/configs/fs4412.h 修改 #define CONFIG_SYS_PROMPT "ORIGEN # " 为 #define CONFIG_SYS_PROMPT "fs4412 # " 修改 #define CONFIG_IDENT_STRING " for ORIGEN" 为 #define CONFIG_IDENT_STRING " for fs4412" 4.指定该板子的配置文件 cp configs/origen_defconfig configs/fs4412_defconfig make fs4412_defconfig 然后执行 ./MAKEALL 在跟目录下面即可以生成boards.cfg //从2014.10版的U-boot开始取消了boards.cfg换使用make menuconfig配置 5.配置boards.cfg 旧的boards.cfg: (目标) (平台) (芯片) (板子名称) (厂商) (类型) (功能) Target ARCH CPU Board name Vendor SoC Options origen arm armv7 origen samsung exynos fs4412 arm armv7 fs4412 samsung exynos 新的boards.cfg: # List of boards # Automatically generated by tools/genboardscfg.py: don't edit//从这里可以看到该文件在新版的U-boot是由genboardscfg.py自动生成的 (状态)(平台)(芯片)(类型) (厂商)(板子名称) (目标)(功能)(维护者) # Status,Arch,CPU,SoC,Vendor,Board,Target,Options,Maintainers - arm armv7 exynos samsung origen fs4412 origen - arm armv7 exynos samsung smdk5420 odroid-xu3 odroid_xu3 Active aarch64 armv8 - armltd vexpress64 vexpress_aemv8a - David Feng <fenghua@phytium.com.cn> 希望是如下: - arm armv7 exynos samsung fs4412 fs4412 6.编译u-boot make distclean make fs4412_config make
二、实现能看到串口终端信息
1.确认第一条指令有运行到(点灯法)
(1)在arch/arm/cpu/armv7/start.S 134行后添加点灯程序: /*--------------------------------------------------*/ 从底板的原理图可以知道led2的GPIO口为GPX2_7 从Exynos4412 User Manual (Public) version 1.0芯片手册P249可知GPX2_7的地址为0x11000c40(控制寄存器) /*--------------------------------------------------*/ reset: bl save_boot_params /* * set the cpu to SVC32 mode */ mrs r0, cpsr bic r0, r0, #0x1f orr r0, r0, #0xd3 msr cpsr,r0 #if 1 //添加点灯程序 ldr r0,=0x11000c40 @GPX2_7 led2 ldr r1,[r0] bic r1,r1,#0xf0000000 @高4位清零 orr r1,r1,#0x10000000 @设置该GPIO口为输出口 str r1,[r0] @将r1的值存储到0x11000c40 ldr r0,=0x11000c44 @数据寄存器的地址 mov r1,#0xff str r1,[r0] @数据寄存器0-7位置1(亮) 其实只有第七位相应的配置寄存器设为了输出口,所以只有第七位起作用 #endif (2)添加三星加密方式 exynos需要三星提供的初始化引导加密后,我们的u-boot才能被引导成功。 cp sdfuse_q/ bootloader/u-boot-2013.01 -rf chmod 777 sdfuse_q -R cp ../CodeSign4SecureBoot ./ -rf (3)修改Makefile (实现sdfuse_q编译) $(obj)u-boot.bin: $(obj)u-boot $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@ $(BOARD_SIZE_CHECK)//后面添加 @#./mkuboot @split -b 14336 u-boot.bin bl2 @make -C sdfuse_q/ @#cp u-boot.bin u-boot-4212.bin @#cp u-boot.bin u-boot-4412.bin @#./sdfuse_q/add_sign @./sdfuse_q/chksum @./sdfuse_q/add_padding @rm bl2a* @echo 注意:tab键缩进,否则makefile编译报错 如果执行了make distclean需重新拷贝CodeSign4SecureBoot (4)拷贝编译脚本 cp build.sh u-boot-2013.01 chmod 777 u-boot-2013.01/build.sh ./buildsh
2.实现串口输出
(1)修改lowlevel_init.S文件
vim board/samsung/fs4412/lowlevel_init.S @添加临时栈 在 lowlevel_init:后添加 ldr sp,=0x02060000 @use iRom stack in bl2 add by william @添加关闭看门狗代码 在 beq wakeup_reset 后添加 #if 1 /*for close watchdog add by william*/ /*PS-Hold high*/ ldr r0,=0x1002330c ldr r1,[r0] orr r1,r1,#0x300 @8、9位置1 str r1,[r0] @将r1的值存回去 ldr r0,=0x11000c08 ldr r1,=0x0 str r1,[r0] @将r1的值存进去 即将该地址的值清零 /*Clear MASK_WDT_RESET_REQUEST*/ ldr r0,=0x1002040c ldr r1,=0x00 str r1,[r0] @将r1的值存进去 即将该地址的值清零 #endif @添加串口初始化代码 在 uart_asm_init: /* setup UART0-UART3 GPIOs (part1) */ mov r0, r7 ldr r1, =EXYNOS4_GPIO_A0_CON_VAL str r1, [r0, #EXYNOS4_GPIO_A0_CON_OFFSET] ldr r1, =EXYNOS4_GPIO_A1_CON_VAL str r1, [r0, #EXYNOS4_GPIO_A1_CON_OFFSET] 后添加 /*===================add by william===================*/ ldr r0,=0x10030000 @从4412芯片手册P446可知CLK_SRC_PERIL0的基地址为0x10030000 偏移地址为0xC250 ldr r1,=0x666666 ldr r2,=CLK_SRC_PERIL0_OFFSET @#define CLK_SRC_PERIL0_OFFSET 0xC250 str r1,[r0,r2] ldr r1,=0x777777 ldr r2,=CLK_DIV_PERIL0_OFFSET @#define CLK_DIV_PERIL0_OFFSET 0xC550 @从4412芯片手册P468可知 str r1,[r0,r2] /*====================================================*/ 注释掉 bl uart_asm_init 下的 bl tzpc_init
三、FLSAH移植(EMMC)
1.初始化emmc
cp ../../transplant_related_documents/movi.c arch/arm/cpu/armv7/exynos/ 修改makefile vim arch/arm/cpu/armv7/exynos/Makefile 在pinmux.o后面添加movi.o 修改板级文件 vim board/samsung/fs4412.c 在 #include <asm/arch/mmc.h> 后面 #include <asm/arch/clk.h>//+++++++ #include "origen_setup.h"//+++++++ 在 #ifdef CONFIG_GENERIC_MMC 后面添加: /*++++++++++++++++++++++++*/ u32 sclk_mmc4;/*clock source for emmc controller*/ #define __REGMY(x) (*((volatile u32*)(x))) #define CLK_SRC_FSYS __REGMY(EXYNOS4_CLOCK_BASE+CLK_SRC_FSYS_OFFSET) #define CLK_DIV_FSYS3 __REGMY(EXYNOS4_CLOCK_BASE+CLK_DIV_FSYS3_OFFSET) int emmc_init() { u32 tmp; u32 clock; u32 i; /*setup_hsmmc_clock*/ /*MMC4 clock src=SCLKMPLL*/ tmp=CLK_SRC_FSYS & ~(0x000f0000); CLK_SRC_FSYS=tmp|0x00060000; /*MMC4 clock div*/ tmp=CLK_DIV_FSYS3 & ~(0x0000ff0f); clock=get_pll_clk(MPLL)/1000000; for(i=0;i<=0xf;i++) { sclk_mmc4=(clock/(i+1)); if(sclk_mmc4<=160)//200 { CLK_DIV_FSYS3=tmp|(i<<0); break; } } emmcdbg("[mjdbg]sclk_mmc4:%d MHZ;mmc_ratio:%d\n",sclk_mmc4,i); sclk_mmc4*=1000000; /* *MMC4 EMMC GPIO CONFIG * *GPK0[0] SD_4_CLK *GPK0[1] SD_4_CMD *GPK0[2] SD_4_CDn *GPK0[3:6] SD_4_DATA[0:3] **/ writel(readl(0x11000048)&~(0xf),0x11000048);//SD_4_CLK/SD_4_CMD pull-down enable writel(readl(0x11000040)&~(0xff),0x11000040);//cdn set to be output writel(readl(0x11000048)&~(0x3<<4),0x11000048);//cdn pull-down disable writel(readl(0x11000044)&~(0x1<<2),0x11000044);//cdn output 0 to shutdown the emmc power writel(readl(0x11000040)&~(0xf<<8)|(1<<8),0x11000040);//cdn set to be output udelay(100*1000); writel(readl(0x11000044)&~(0x1<<2),0x11000044);//cdn output 1 writel(0x03333133,0x11000040); writel(0x00003FF0,0x11000048); writel(0x00002AAA,0x1100004C); #ifdef CONFIG_EMMC_8Bit writel(0x04444000,0x11000060); writel(0x00003FC0,0x11000068); writel(0x00002AAA,0x1100006C); #endif #ifdef USE_MMC4 smdk_s5p_mshc_init(); #endif }
/++++++++++++++++++++++++/
修改board_mmc_init为如下:
int board_mmc_init(bd_t *bis) { int i, err; /*++++++++++*/ #ifdef CONFIG_EMMC err=emmc_init(); return err; #endif /*++++++++++*/ }
在末尾添加:
#ifdef CONFIG_BOARD_LATE_INIT #include <movi.h> int chk_bootdev(void)//mj for boot device check { char run_cmd[100]; struct mmc *mmc; int boot_dev=0; int cmp_off=0x10; ulong start_blk,blkcnt; mmc=find_mmc_device(0); if(mmc==NULL) { printf("There is no eMMC card,Booting device is SD card\n"); boot_dev=1; return boot_dev; } start_blk=(24*1024/MOVI_BLKSIZE); blkcnt=0x10; sprintf(run_cmd,"emmc open 0"); run_command(run_cmd,0); sprintf(run_cmd,"mmc read 0 %lx %lx %lx",CFG_PHY_KERNEL_BASE,start_blk,blkcnt); run_command(run_cmd,0); /*switch mmc to normal parition*/ sprintf(run_cmd,"emmc close 0"); run_command(run_cmd,0); return 0; } int board_late_init(void) { int boot_dev=0; char boot_cmd[100]; boot_dev=chk_bootdev(); if(!boot_dev) { printf("\n\nChecking Boot Mode......EMMC4.41\n"); } return 0; }
2.添加相关命令:
添加命令: transplant_related_documents# cp cmd_movi.c ../bootloader/u-boot-2013.01/common/ transplant_related_documents# cp cmd_mmc.c ../bootloader/u-boot-2013.01/common/ transplant_related_documents# cp cmd_mmc_fdisk.c ../bootloader/u-boot-2013.01/common/ 修改common/Makefile COBJS-$(CONFIG_CMD_MMC) += cmd_mmc.o COBJS-$(CONFIG_CMD_MMC) += cmd_mmc_fdisk.o//+++ COBJS-$(CONFIG_CMD_MOVINAND)+=cmd_movi.o//+++
添加驱动:
cp mmc.c ../bootloader/u-boot-2013.01/drivers/mmc/ cp s5p_mshc.c ../bootloader/u-boot-2013.01/drivers/mmc/ cp mmc.h movi.h s5p_mshc.h ../bootloader/u-boot-2013.01/include/ 修改drivers/mmc/Makefile vim drivers/mmc/Makefile COBJS-$(CONFIG_S5P_MSHC) +=s5p_mshc.o
3.添加EMMC相关配置
vim include/configs/fs412.h
添加:
/*++++++++++++++++++++++++++++++*/ #define CONFIG_EVT1 1 /*EVT1*/ #ifdef CONFIG_EVT1 #define CONFIG_EMMC44_CH4 /*eMMC44_CH4 (OMPIN[5:1] = 4)*/ #ifdef CONFIG_SDMMC_CH2 #define CONFIG_S3C_HSMMC #undef DEBUG_S3C_HSMMC #define USE_MMC2 #endif #ifdef CONFIG_EMMC44_CH4 #define CONFIG_S5P_MSHC #define CONFIG_EMMC 1 #define USE_MMC4 /* #define CONFIG_EMMC_8Bit */ #define CONFIG_EMMC_EMERGENCY /* * #define emmcdbg(fmt,args...) printf(fmt ,##args) //for emmc debug * #define emmcdbg(fmt,args...) */ #define emmcdbg(fmt,args...) #endif #endif /*end CONFIG_EVT1*/ #define CONFIG_CMD_MOVINAND #define CONFIG_CLK_1000_400_200 #define CFG_PHY_UBOOT_BASE CONFIG_SYS_SDRAM_BASE + 0x3e00000 #define CFG_PHY_KERNEL_BASE CONFIG_SYS_SDRAM_BASE + 0x8000 #define BOOT_MMCSD 0x3 #define BOOT_EMMC43 0x6 #define BOOT_EMMC441 0x7 #define CONFIG_BOARD_LATE_INIT /*++++++++++++++++++++++++++++++*/
4.内存适配
确定板子内存大小,如果是2G的,那么需要修改如下代码:
vim include/configs/fs4412.h
修改
#define SDRAM_BANK_SIZE (256UL << 20UL) /* 256 MB */ 为 #define SDRAM_BANK_SIZE (512UL << 20UL) /* 512 MB */
注意:如果该板子是1G却配置成2G将会发生如下问题:
U-Boot 2013.01 (Aug 24 2014 - 12:01:19) for FS4412
CPU: Exynos4412@1000MHz
Board: FS4412
DRAM: 2 GiB //启动的时候卡在这里就没反应了
四、网卡移植
1.添加网络初始化代码
vim board/samsung/fs4412/fs4412.c
在struct exynos4_gpio_part2 *gpio2;后添加:
========================== #ifdef CONFIG_DRIVER_DM9000 #define EXYNOS4412_SROMC_BASE 0X12570000 #define DM9000_Tacs (0x1) // 0clk address set-up #define DM9000_Tcos (0x1) // 4clk chip selection set-up #define DM9000_Tacc (0x5) // 14clk access cycle #define DM9000_Tcoh (0x1) // 1clk chip selection hold #define DM9000_Tah (0xC) // 4clk address holding time #define DM9000_Tacp (0x9) // 6clk page mode access cycle #define DM9000_PMC (0x1) // normal(1data)page mode configuration struct exynos_sromc { unsigned int bw; unsigned int bc[6]; }; /* * s5p_config_sromc() - select the proper SROMC Bank and configure the * band width control and bank control registers * srom_bank - SROM * srom_bw_conf - SMC Band witdh reg configuration value * srom_bc_conf - SMC Bank Control reg configuration value */ void exynos_config_sromc(u32 srom_bank, u32 srom_bw_conf, u32 srom_bc_conf) { unsigned int tmp; struct exynos_sromc *srom = (struct exynos_sromc *)(EXYNOS4412_SROMC_BASE); /* Configure SMC_BW register to handle proper SROMC * bank */ tmp = srom->bw; tmp &= ~(0xF << (srom_bank * 4)); tmp |= srom_bw_conf; srom->bw = tmp; /* Configure SMC_BC * register */ srom->bc[srom_bank] = srom_bc_conf; } static void dm9000aep_pre_init(void) { unsigned int tmp; unsigned char smc_bank_num = 1; unsigned int smc_bw_conf=0; unsigned int smc_bc_conf=0; /* gpio configuration */ writel(0x00220020, 0x11000000 + 0x120); writel(0x00002222, 0x11000000 + 0x140); /* 16 Bit bus width */ writel(0x22222222, 0x11000000 + 0x180); writel(0x0000FFFF, 0x11000000 + 0x188); writel(0x22222222, 0x11000000 + 0x1C0); writel(0x0000FFFF, 0x11000000 + 0x1C8); writel(0x22222222, 0x11000000 + 0x1E0); writel(0x0000FFFF, 0x11000000 + 0x1E8); smc_bw_conf &= ~(0xf<<4); smc_bw_conf |= (1<<7) | (1<<6) | (1<<5) | (1<<4); smc_bc_conf = ((DM9000_Tacs << 28) | (DM9000_Tcos << 24) | (DM9000_Tacc << 16) | (DM9000_Tcoh << 12) | (DM9000_Tah << 8) | (DM9000_Tacp << 4) | (DM9000_PMC)); exynos_config_sromc(smc_bank_num,smc_bw_conf,smc_bc_conf); } #endif ========================================= 在 gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL); 后面添加: #ifdef CONFIG_DRIVER_DM9000 dm9000aep_pre_init(); #endif 在文件末尾添加: #ifdef CONFIG_CMD_NET int board_eth_init(bd_t *bis) { int rc = 0; #ifdef CONFIG_DRIVER_DM9000 rc = dm9000_initialize(bis); #endif return rc; } #endif
2.修改配置文件添加网络相关配置
include/configs/fs4412.h:
#define CONFIG_CMD_PING #define CONFIG_CMD_NET #undef CONFIG_CMD_NFS 在文件末尾 #endif /* __CONFIG_H */ 前添加: #ifdef CONFIG_CMD_NET #define CONFIG_NET_MULTI #define CONFIG_DRIVER_DM9000 1 #define CONFIG_DM9000_BASE 0x05000000 #define DM9000_IO CONFIG_DM9000_BASE #define DM9000_DATA (CONFIG_DM9000_BASE + 4) #define CONFIG_DM9000_USE_16BIT #define CONFIG_DM9000_NO_SROM 1 #define CONFIG_ETHADDR 12:23:34:45:56:67 #define CONFIG_IPADDR 192.168.1.120 #define CONFIG_SERVERIP 192.168.1.110 #define CONFIG_GATEWAYIP 192.168.1.1 #define CONFIG_NETMASK 255.255.255.0 #endif
相关文章推荐
- Playing audio from Node.js using Edge.js
- 小记天池大赛
- Github使用教程
- 文本相似性问题个人见解
- HDU3953(找规律,坑~)
- Xcode The identity used to sign the executable is no longer valid. 错误解决
- HDU 4771 (DFS+BFS)
- GET请求和POST请求剖析
- 全局函数的Result一定要每次都初始化,否则上次的结果会被保持到下一次继续使用
- GitHub
- Newtonsoft.Json高级用法
- 自定义Animation动画,完成跑圈动作
- 从头认识java-4.7 构造器初始化(3)
- mysql创建数据库实例和导入数据
- Scala教程(十五)Scala的特性逆变与协变
- DrawerLayout的使用例子
- 从头认识java-4.7 构造器初始化(3)
- 同余问题(2)逆元,孙子定理
- 利用bigDecimal直接截取小数位数
- JXL导入导出Excel到数据库