Tiny4412.c
int board_init(void)
#ifdef CONFIG_HAS_PMIC 注释掉了和i2c的读写部分
............
#else
/* fixed voltage */写死电压值
#define VDDM_F(vm) (#vm)
#define SHOW_FIXED_VDD(lab, a) printf("%s: %s\n", lab, VDDM_F(a))
printf("\n");
SHOW_FIXED_VDD("vdd_arm", CONFIG_PM_VDD_ARM);
SHOW_FIXED_VDD("vdd_int", CONFIG_PM_VDD_INT);
SHOW_FIXED_VDD("vdd_mif", CONFIG_PM_VDD_MIF);
#endif
//设置 Tiny4412 machine ID 4608 */
#ifdef CONFIG_TINY4412A
gd->bd->bi_arch_number = MACH_TYPE_TINY4412;
#else
if (((PRO_ID & 0x300) >> 8) == 2)
gd->bd->bi_arch_number = MACH_TYPE_C210;
else
gd->bd->bi_arch_number = MACH_TYPE_V310;
#endif
Tiny4412.h
#define CONFIG_PM
#define CONFIG_PM_VDD_ARM 1.2
#define CONFIG_PM_VDD_INT 1.0
#define CONFIG_PM_VDD_G3D 1.1
#define CONFIG_PM_VDD_MIF 1.1
#define CONFIG_PM_VDD_LDO14 1.8
clock_init_tiny4412.S
#include "tiny4212_val.h"
//注释掉了C2C部分和DMC部分(power modes change when you enable c2c;DMC block can be automatically in retention state according to C2C state when ENABLE_C2C field of C2C_CTRL
register is set to "1".)
#ifdef CONFIG_C2C
/* TODO: update it */
/* check C2C_CTRL enable bit */
ldr r3, =S5PV310_POWER_BASE
ldr r1, [r3, #C2C_CTRL_OFFSET]
and r1, r1, #1
cmp r1, #0
bne v310_2
@ ConControl
#ifdef MEM_DLLl_ON
ldr r0, =APB_DMC_0_BASE
ldr r1, =0x7F10100A
ldr r2, =DMC_PHYCONTROL0
str r1, [r0, r2]
ldr r1, =0xE0000084
ldr r2, =DMC_PHYCONTROL1
str r1, [r0, r2]
ldr r1, =0x7F10100B
ldr r2, =DMC_PHYCONTROL0
str r1, [r0, r2]
/* wait ?us */
mov r1, #0x20000
8: subs r1, r1, #1
bne 8b
ldr r1, =0x0000008C
ldr r2, =DMC_PHYCONTROL1
str r1, [r0, r2]
ldr r1, =0x00000084
ldr r2, =DMC_PHYCONTROL1
str r1, [r0, r2]
/* wait ?us */
mov r1, #0x20000
9: subs r1, r1, #1
bne 9b
ldr r0, =APB_DMC_1_BASE
ldr r1, =0x7F10100A
ldr r2, =DMC_PHYCONTROL0
str r1, [r0, r2]
ldr r1, =0xE0000084
ldr r2, =DMC_PHYCONTROL1
str r1, [r0, r2]
ldr r1, =0x7F10100B
ldr r2, =DMC_PHYCONTROL0
str r1, [r0, r2]
/* wait ?us */
mov r1, #0x20000
10: subs r1, r1, #1
bne 10b
ldr r1, =0x0000008C
ldr r2, =DMC_PHYCONTROL1
str r1, [r0, r2]
ldr r1, =0x00000084
ldr r2, =DMC_PHYCONTROL1
str r1, [r0, r2]
/* wait ?us */
mov r1, #0x20000
11: subs r1, r1, #1
bne 11b
#endif
ldr r0, =APB_DMC_0_BASE
ldr r1, =0x0FFF30FA
ldr r2, =DMC_CONCONTROL
str r1, [r0, r2]
ldr r0, =APB_DMC_1_BASE
ldr r1, =0x0FFF30FA
ldr r2, =DMC_CONCONTROL
str r1, [r0, r2]
ldr r0, =APB_DMC_0_BASE
ldr r1, =0x00202533
ldr r2, =DMC_MEMCONTROL
str r1, [r0, r2]
ldr r0, =APB_DMC_1_BASE
ldr r1, =0x00202533
ldr r2, =DMC_MEMCONTROL
str r1, [r0, r2]
v310_2:
#endif /* CONFIG_C2C */
lowlevel_init.S: //关pmic,设置mmu,增加调试打印和点灯程序。
/* led (GPM4_0~3) on */
ldr r0, =0x110002E0
ldr r1, =0x00001111
str r1, [r0]
ldr r1, =0x0e
str r1, [r0, #0x04]
*/
#if defined(CONFIG_HAS_PMIC)
bl pmic_init
#endif
#if CONFIG_LL_DEBUG
mov r4, #0x4000
.L0:
sub r4, r4, #1
cmp r4, #0
bne .L0
mov r0, #'\r'
bl uart_asm_putc
mov r0, #'\n'
bl uart_asm_putc
ldr r1, =0x40000000
ldr r2, =0x87654321
str r2, [r1]
str r2, [r1, #0x04]
str r2, [r1, #0x08]
ldr r2, =0x55aaaa55
str r2, [r1, #0x10]
nop
mov r4, #0xC0000
.L1:
subs r4, r4, #1
bne .L1
ldr r0, [r1]
bl uart_asm_putx
mov r0, #'.'
bl uart_asm_putc
ldr r0, [r1, #0x04]
bl uart_asm_putx
mov r0, #'.'
bl uart_asm_putc
ldr r0, [r1, #0x08]
bl uart_asm_putx
mov r0, #'.'
bl uart_asm_putc
ldr r0, [r1, #0x10]
bl uart_asm_putx
mov r0, #'>'
bl uart_asm_putc
#endif /* CONFIG_LL_DEBUG */
#if CONFIG_LL_DEBUG
.globl uart_asm_putc
uart_asm_putc:
push {r9}
ldr r9, =S5PV310_UART_CONSOLE_BASE
str r0, [r9, #UTXH_OFFSET]
ldr r9, =0x20000 @delay
.Luartputc:
sub r9, r9, #1
cmp r9, #0
bne .Luartputc
pop {r9}
mov pc, lr
.globl uart_asm_putx
uart_asm_putx:
stmfd sp!, {r3, r4, r5, lr}
mov r5, r0
mov r4, #28
.Luartputx:
mov r0, r5, asr r4
and r0, r0, #15
cmp r0, #9
addle r0, r0, #48
addgt r0, r0, #55
bl uart_asm_putc
sub r4, r4, #4
cmn r4, #4
bne .Luartputx
ldmfd sp!, {r3, r4, r5, pc}
#endif /* CONFIG_LL_DEBUG */
mmu_table:
.set __base,0
// Access for iRAM
.rept 0x200
FL_SECTION_ENTRY __base,3,0,0,0
.set __base,__base+1
.endr
// Not Allowed
.rept 0x400 - 0x200
.word 0x00000000
.endr
.set __base,0x400
// 1024MB for SDRAM with cacheable
.rept 0x800 - 0x400
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr
// access is not allowed.
.rept 0xc00 - 0x800
.word 0x00000000
.endr
Makefile:
COBJS-y := tiny4412.o
COBJS-y += pmic.o
SOBJS := lowlevel_init.o
SOBJS += mem_init_tiny4412.o
SOBJS += clock_init_tiny4412.o
tiny4412_val.h:
/* ARM_CLOCK_1Ghz */
#elif defined(CONFIG_CLK_ARM_1000_APLL_1000)
#define APLL_MDIV 0x7D
#define APLL_PDIV 0x3
#define APLL_SDIV 0x0
/* CLK_DIV_CPU0 */
#define APLL_RATIO 0x1
#define CORE_RATIO 0x0
#define CORE2_RATIO 0x0
#define COREM0_RATIO 0x2
#define COREM1_RATIO 0x5
#define PERIPH_RATIO 0x7
#define ATB_RATIO 0x4
#define PCLK_DBG_RATIO 0x1
#define CLK_DIV_CPU0_VAL ((CORE2_RATIO << 28) \
| (APLL_RATIO << 24) \
| (PCLK_DBG_RATIO << 20)\
| (ATB_RATIO << 16) \
| (PERIPH_RATIO <<12) \
| (COREM1_RATIO << 8) \
| (COREM0_RATIO << 4) \
| (CORE_RATIO))
#define CLK_DIV_CPU1_VAL ((CORES_RATIO << 8) \
| (HPM_RATIO << 4) \
| (COPY_RATIO))
#elif defined(CONFIG_CLK_BUS_DMC_200_400)
#define MPLL_MDIV 0x64
#define MPLL_PDIV 0x3
#define MPLL_SDIV 0x0
/* APLL_CON1 */
#define APLL_CON1_VAL (0x00803800)
/* MPLL_CON1 */
#define MPLL_CON1_VAL (0x00803800)
#define EPLL_MDIV 0x40
#define EPLL_PDIV 0x2
#define EPLL_SDIV 0x3
#define EPLL_CON1_VAL 0x66010000
#define EPLL_CON2_VAL 0x00000080
#define VPLL_MDIV 0x48
#define VPLL_PDIV 0x2
#define VPLL_SDIV 0x3
#define VPLL_CON1_VAL 0x66010000
#define VPLL_CON2_VAL 0x00000080
/* Set PLL */
#define set_pll(mdiv, pdiv, sdiv) (1<<31 | mdiv<<16 | pdiv<<8 | sdiv)
#define APLL_CON0_VAL set_pll(APLL_MDIV,APLL_PDIV,APLL_SDIV)
#define MPLL_CON0_VAL set_pll(MPLL_MDIV,MPLL_PDIV,MPLL_SDIV)
#define EPLL_CON0_VAL set_pll(EPLL_MDIV,EPLL_PDIV,EPLL_SDIV)
#define VPLL_CON0_VAL set_pll(VPLL_MDIV,VPLL_PDIV,VPLL_SDIV)
/* CLK_SRC_CPU */
/* 0 = MOUTAPLL, 1 = SCLKMPLL */
#define MUX_HPM_SEL_MOUTAPLL 0
#define MUX_HPM_SEL_SCLKMPLL 1
#define MUX_CORE_SEL_MOUTAPLL 0
#define MUX_CORE_SEL_SCLKMPLL 1
/* 0 = FILPLL, 1 = MOUT */
#define MUX_MPLL_SEL_FILPLL 0
#define MUX_MPLL_SEL_MOUTMPLLFOUT 1
#define MUX_APLL_SEL_FILPLL 0
#define MUX_APLL_SEL_MOUTMPLLFOUT 1
#define CLK_SRC_CPU_VAL_FINPLL ((MUX_HPM_SEL_MOUTAPLL << 20) \
| (MUX_CORE_SEL_MOUTAPLL <<16) \
| (MUX_MPLL_SEL_FILPLL << 8) \
| (MUX_APLL_SEL_FILPLL <<0))
#define CLK_SRC_CPU_VAL_MOUTMPLLFOUT ((MUX_HPM_SEL_MOUTAPLL << 20) \
| (MUX_CORE_SEL_MOUTAPLL <<16) \
| (MUX_MPLL_SEL_MOUTMPLLFOUT << 8) \
| (MUX_APLL_SEL_MOUTMPLLFOUT <<0))
/* CLK_SRC_DMC */
#define MUX_PWI_SEL 0x0
#define MUX_CORE_TIMERS_SEL 0x0
#define MUX_DPHY_SEL 0x0
#define MUX_DMC_BUS_SEL 0x0
#define CLK_SRC_DMC_VAL ((MUX_PWI_SEL << 16) \
| (MUX_CORE_TIMERS_SEL << 12) \
| (MUX_DPHY_SEL << 8) \
| (MUX_DMC_BUS_SEL << 4))
/* CLK_DIV_DMC0 */
#define CORE_TIMERS_RATIO 0x0
#define COPY2_RATIO 0x0
#define DMCP_RATIO 0x1
#define DMCD_RATIO 0x1
#define DMC_RATIO 0x1
#define DPHY_RATIO 0x1
#define ACP_PCLK_RATIO 0x1
#define ACP_RATIO 0x3
#define CLK_DIV_DMC0_VAL ((CORE_TIMERS_RATIO << 28) \
| (COPY2_RATIO << 24) \
| (DMCP_RATIO << 20) \
| (DMCD_RATIO << 16) \
| (DMC_RATIO << 12) \
| (DPHY_RATIO << 8) \
| (ACP_PCLK_RATIO << 4) \
| (ACP_RATIO))
#define CLK_DIV_DMC1_VAL 0x07071713
/* CLK_SRC_TOP0 */
#define MUX_ONENAND_SEL 0x0 /* 0 = DOUT133, 1 = DOUT166 */
#define MUX_ACLK_133_SEL 0x0 /* 0 = SCLKMPLL, 1 = SCLKAPLL */
#define MUX_ACLK_160_SEL 0x0
#define MUX_ACLK_100_SEL 0x0
#define MUX_ACLK_200_SEL 0x0
#define MUX_VPLL_SEL 0x1
#define MUX_EPLL_SEL 0x1
#define CLK_SRC_TOP0_VAL ((MUX_ONENAND_SEL << 28) \
| (MUX_ACLK_133_SEL << 24) \
| (MUX_ACLK_160_SEL << 20) \
| (MUX_ACLK_100_SEL << 16) \
| (MUX_ACLK_200_SEL << 12) \
| (MUX_VPLL_SEL << 8) \
| (MUX_EPLL_SEL << 4))
/* CLK_SRC_TOP1 */
#define VPLLSRC_SEL 0x0 /* 0 = FINPLL, 1 = SCLKHDMI27M */
#define CLK_SRC_TOP1_VAL (0x01111000)
//#define CLK_SRC_TOP1_VAL (VPLLSRC_SEL)
/* CLK_DIV_TOP */
#define ACLK_400_MCUISP_RATIO 0x1
#define ACLK_266_GPS_RATIO 0x2
#define ONENAND_RATIO 0x1
#define ACLK_133_RATIO 0x5
#define ACLK_160_RATIO 0x4
#define ACLK_100_RATIO 0x7
#define ACLK_200_RATIO 0x4
#define CLK_DIV_TOP_VAL ((ACLK_400_MCUISP_RATIO << 24) \
| (ACLK_266_GPS_RATIO << 20) \
| (ONENAND_RATIO << 16) \
| (ACLK_133_RATIO << 12) \
| (ACLK_160_RATIO << 8) \
| (ACLK_100_RATIO << 4) \
| (ACLK_200_RATIO))
/* CLK_SRC_LEFTBUS */
#define CLK_SRC_LEFTBUS_VAL (0x10)
/* CLK_DIV_LEFRBUS */
#define GPL_RATIO 0x1
#define GDL_RATIO 0x3
#define CLK_DIV_LEFRBUS_VAL ((GPL_RATIO << 4) \
| (GDL_RATIO))
/* CLK_SRC_RIGHTBUS */
#define CLK_SRC_RIGHTBUS_VAL (0x10)
/* CLK_DIV_RIGHTBUS */
#define GPR_RATIO 0x1
#define GDR_RATIO 0x3
#define CLK_DIV_RIGHTBUS_VAL ((GPR_RATIO << 4) \
| (GDR_RATIO))
/* APLL_LOCK */
#define APLL_LOCK_VAL (APLL_PDIV * 270)
/* MPLL_LOCK */
#define MPLL_LOCK_VAL (MPLL_PDIV * 270)
/* EPLL_LOCK */
#define EPLL_LOCK_VAL (EPLL_PDIV * 3000)
/* VPLL_LOCK */
#define VPLL_LOCK_VAL (VPLL_PDIV * 3000)
/* CLK_SRC_PERIL0 */
#define PWM_SEL 0
#define UART5_SEL 6
#define UART4_SEL 6
#define UART3_SEL 6
#define UART2_SEL 6
#define UART1_SEL 6
#define UART0_SEL 6
#define CLK_SRC_PERIL0_VAL ((PWM_SEL << 24)\
| (UART5_SEL << 20) \
| (UART4_SEL << 16) \
| (UART3_SEL << 12) \
| (UART2_SEL<< 8) \
| (UART1_SEL << 4) \
| (UART0_SEL))
/* CLK_DIV_PERIL0 */
#if defined(CONFIG_CLK_BUS_DMC_165_330)
#define UART5_RATIO 7
#define UART4_RATIO 7
#define UART3_RATIO 7
#define UART2_RATIO 7
#define UART1_RATIO 7
#define UART0_RATIO 7
#define CLK_DIV_PERIL0_VAL ((UART5_RATIO << 20) \
| (UART4_RATIO << 16) \
| (UART3_RATIO << 12) \
| (UART2_RATIO << 8) \
| (UART1_RATIO << 4) \
| (UART0_RATIO))
#define MPLL_DEC (MPLL_MDIV * MPLL_MDIV / (MPLL_PDIV * 2^(MPLL_SDIV-1)))
#define SCLK_UART MPLL_DEC / (UART1_RATIO+1)
#define UART_UBRDIV_VAL 0x35 /* (SCLK_UART/(115200*16) -1) */
#define UART_UDIVSLOT_VAL 0x4 /*((((SCLK_UART*10/(115200*16) -10))%10)*16/10)*/
比较tiny4412_val.h和smdk4212_val.h不同的地方主要是:
设置CONFIG_CLK_ARM_1200_APLL_1400即是主频为1.4G。
DMC1的设置
UART*_RATIO设置
uboot中 Tiny 4412和smdk 4212的一些不同
最新推荐文章于 2019-05-19 16:12:05 发布