您的位置:首页 > 其它

fs4412开发板学习笔记(五)

2015-10-27 23:29 260 查看
一、建立自己的平台

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: