U-boot1.1.6移植到TQ2440开发板(上)

发布者:数字梦想最新更新时间:2015-11-02 来源: eefocus关键字:U-boot1  6  TQ2440开发板 手机看文章 扫描二维码
随时随地手机看文章
U-Boot主要目录结构

- board 目标板相关文件,主要包含SDRAM、FLASH驱动;

- common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;

- cpu 与处理器相关的文件。如mpc8xx子目录下含串口、网口、LCD驱动及中断初始化等文件;

- driver 通用设备驱动,如CFI FLASH驱动(目前对INTEL FLASH支持较好)

- doc U-Boot的说明文档;

- examples可在U-Boot下运行的示例程序;如hello_world.c,timer.c;

- include U-Boot头文件;尤其configs子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件;

- lib_xxx 处理器体系相关的文件,如lib_ppc, lib_arm目录分别包含与PowerPC、ARM体系结构相关的文件;

- net 与网络功能相关的文件目录,如bootp,nfs,tftp;

- post 上电自检文件目录。尚有待于进一步完善;

- rtc RTC驱动程序;

- tools 用于创建U-Boot S-RECORD和BIN镜像文件的工具;

 

 

一、建立自己的开发板文件

1.在borad文件夹中新建自己的板子目录,复制sbc2410x中的文件到此目录,作为蓝本,加快移植进度,修改板子目录下的makefile文件COBJS := tq2440.o flash.o(其中tq2440.o文件的生成必须要修改此目录下的sbc2410x.c文件)

2.在include/configs文件夹下以sbc2410x.h为蓝本,创建tq2440.h文件

3.修改uboot根目录下的makefile文件,确定CROSS_COMPLE即编译器选项,加入make选项:

tq2440_config:unconfig

(TAB)@./mkconfig $(@:_config=) arm arm920t tq2440 NULL s3c24x0

其中:

arm: CPU的架构(ARCH)

arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。

tq2440: 开发板的型号(BOARD),对应于board/tq2440目录。

NULL: 开发者/或经销商(vender)。

s3c24x0: 片上系统(SOC)。

4.接下来测试是否能编译通过,执行:make disclean--删除原来的编译结果

make tqconfig

成功后出现Configuring for xxx board.....

make –可以生成uboot.bin文件

 

 

二、修改源码

 

1、修改start.S

 

修改如下代码:

 

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

ldr r0, =pWTCON

mov r1, #0x0

str r1, [r0]

 

 

mov r1, #0xffffffff

ldr r0, =INTMSK

str r1, [r0]

# if defined(CONFIG_S3C2410)

ldr r1, =0x3ff

ldr r0, =INTSUBMSK

str r1, [r0]

# endif

#ifdefined(CONFIG_S3C2440)

ldr r1, =0x7fff

ldr r0, =INTSUBMSK

str r1, [r0]

# endif

 

 

#if0

 

 

ldr r0, =CLKDIVN

mov r1, #3

str r1, [r0]

#endif

#endif

 

#ifndefCONFIG_SKIP_LOWLEVEL_INIT

bl cpu_init_crit

#endif

 

//把堆栈初始化拿到前面来,应为后面要写的时钟初始化函数会用到堆栈

 

stack_setup:

ldr r0, _TEXT_BASE

sub r0, r0, #CFG_MALLOC_LEN

sub r0, r0, #CFG_GBL_DATA_SIZE

#ifdefCONFIG_USE_IRQ

sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)

#endif

sub sp, r0, #12

//跳转到时钟初始话函数

bl clock_init

 

 

#ifndefCONFIG_SKIP_RELOCATE_UBOOT

relocate:

adr r0, _start

ldr r1, _TEXT_BASE

cmp r0, r1

beq stack_setup

 

ldr r2, _armboot_start

ldr r3, _bss_start

sub r2, r3, r2

 

//屏蔽原先代码,重写代码搬运函数

#if1

bl CopyCode2Ram

#else

add r2, r0, r2

 

copy_loop:

ldmia r0!, {r3-r10}

stmia r1!, {r3-r10}

cmp r0, r2

ble copy_loop

#endif

#endif

 

 

 

接着在include/configs/tq2440.h添加

#define CONFIG_S3C2440 1

#define CONFIG_TQ2440 1

并屏蔽原先的芯片和开发板定义,与此同时s3c24x0.h中的S3C24X0_GPIO结构体也要改写,使其支持2440,而且要添加

 

S3C24X0_REG32 res9[4];

S3C24X0_REG32 GPJCON;

S3C24X0_REG32 GPJDAT;

S3C24X0_REG32 GPJUP;

此为GPIO_J口的定义

添加typedefstruct{

S3C24X0_REG32 NFCONF;

S3C24X0_REG32 NFCONT;

S3C24X0_REG32 NFCMD;

S3C24X0_REG32 NFADDR;

S3C24X0_REG32 NFDATA;

S3C24X0_REG32 NFMECCD0;

S3C24X0_REG32 NFMECCD1;

S3C24X0_REG32 NFSECCD;

S3C24X0_REG32 NFSTAT;

S3C24X0_REG32 NFESTAT0;

S3C24X0_REG32 NFESTAT1;

S3C24X0_REG32 NFMECC0;

S3C24X0_REG32 NFMECC1;

S3C24X0_REG32 NFSECC;

S3C24X0_REG32 NFSBLK;

S3C24X0_REG32 NFEBLK;

} S3C2440_NAND;

其他结构体也要修改

修改lowlevel_init.S,修改54,58,126行即可,即外部存储器控制器。

54 #defineB1_BWSCON (DW16)

58 #defineB5_BWSCON (DW8)

126 #defineREFCNT 0x4f4

lowlevel_init.S 主要设置SDRAM配置

ARM的存储器控制器

位宽和等待控制寄存器BWSCON中每4位控制一个BANK,最高4位对应BANK7、接下来4位对应BANK6,依此类推

8 个存储器 banks

6 个是 ROM,SRAM 等类型存储器 bank

2 个是可以作为 ROM、SRAM、SDRAM 等存储器 bank

BANK控制寄存器BANKCONx(BANKCON1~5)这几个寄存器用来控制BANK0~BANK5外接设备的访问时序,一般使用默认的0x0700即可。

BANK控制寄存器BANKCONx(BANKCON6~7,在8个BANK中,只有BANK6和BANK7可以外接SRAM和SDRAM,所以BANKCON6~BANKCON7与BANKCON0~BANKCON5有点不同。

 

在board文件夹中添加boot_init.c文件,并修改makefile(boot_init.c文件主要包含nand的读写,时钟的初始化,和代码的拷贝函数)

boot_init.c

#include

#include

 

#defineGSTATUS1 (*(volatileunsignedint*)0x560000B0)

#defineBUSY 1

 

#defineNAND_SECTOR_SIZE 512

#defineNAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)

 

#defineNAND_SECTOR_SIZE_LP 2048

#defineNAND_BLOCK_MASK_LP (NAND_SECTOR_SIZE_LP - 1)

 

 

charbLARGEBLOCK; //HJ_add 20090807

charb128MB; //HJ_add 20090807

 

 

 

voidnand_init_ll(void);

intnand_read_ll(unsignedchar*buf, unsignedlongstart_addr, intsize);

intnand_read_ll_lp(unsignedchar*buf, unsignedlongstart_addr, intsize);

 

 

staticvoidnand_reset(void);

staticvoidwait_idle(void);

staticvoidnand_select_chip(void);

staticvoidnand_deselect_chip(void);

staticvoidwrite_cmd(intcmd);

staticvoidwrite_addr(unsignedintaddr);

staticvoidwrite_addr_lp(unsignedintaddr);

staticunsignedcharread_data(void);

intNF_ReadID(void); //HJ_add 20090807

[page]

 

staticvoids3c2440_nand_reset(void);

staticvoids3c2440_wait_idle(void);

staticvoids3c2440_nand_select_chip(void);

staticvoids3c2440_nand_deselect_chip(void);

staticvoids3c2440_write_cmd(intcmd);

staticvoids3c2440_write_addr(unsignedintaddr);

staticvoids3c2440_write_addr_lp(unsignedintaddr);

staticunsignedchars3c2440_read_data(void);

 

 

 

 

staticvoids3c2440_nand_reset(void)

{

s3c2440_nand_select_chip();

s3c2440_write_cmd(0xff); // 复位命令

s3c2440_wait_idle();

s3c2440_nand_deselect_chip();

}

 

 

staticvoids3c2440_wait_idle(void)

{

inti;

S3C2440_NAND* s3c2440nand = (S3C2440_NAND*)0x4e000000;

volatileunsignedchar*p = (volatileunsignedchar*)&s3c2440nand->NFSTAT;

 

while(!(*p & BUSY))

for(i=0; i<10; i++);

}

 

 

staticvoids3c2440_nand_select_chip(void)

{

inti;

S3C2440_NAND* s3c2440nand = (S3C2440_NAND*)0x4e000000;

 

s3c2440nand->NFCONT&= ~(1<<1);

for(i=0; i<10; i++);

}

 

 

staticvoids3c2440_nand_deselect_chip(void)

{

S3C2440_NAND* s3c2440nand = (S3C2440_NAND*)0x4e000000;

 

s3c2440nand->NFCONT|= (1<<1);

}

 

 

staticvoids3c2440_write_cmd(intcmd)

{

S3C2440_NAND* s3c2440nand = (S3C2440_NAND*)0x4e000000;

 

volatileunsignedchar*p = (volatileunsignedchar*)&s3c2440nand->NFCMD;

*p = cmd;

}

 

 

staticvoids3c2440_write_addr(unsignedintaddr)

{

inti;

S3C2440_NAND* s3c2440nand = (S3C2440_NAND*)0x4e000000;

volatileunsignedchar*p = (volatileunsignedchar*)&s3c2440nand->NFADDR;

 

*p = addr & 0xff;

for(i=0; i<10; i++);

*p = (addr >> 9) & 0xff;

for(i=0; i<10; i++);

*p = (addr >> 17) & 0xff;

for(i=0; i<10; i++);

*p = (addr >> 25) & 0xff;

for(i=0; i<10; i++);

}

 

 

 

staticvoids3c2440_write_addr_lp(unsignedintaddr)

{

inti;

S3C2440_NAND* s3c2440nand = (S3C2440_NAND*)0x4e000000;

volatileunsignedchar*p = (volatileunsignedchar*)&s3c2440nand->NFADDR;

intcol, page;

 

col = addr & NAND_BLOCK_MASK_LP;

page = addr / NAND_SECTOR_SIZE_LP;

 

*p = col & 0xff;

for(i=0; i<10; i++);

*p = (col >> 8) & 0x0f;

for(i=0; i<10; i++);

*p = page & 0xff;

for(i=0; i<10; i++);

*p = (page >> 8) & 0xff;

for(i=0; i<10; i++);

if(b128MB == 0)

*p = (page >> 16) & 0x03;

for(i=0; i<10; i++);

}

 

 

staticunsignedchars3c2440_read_data(void)

{

S3C2440_NAND* s3c2440nand = (S3C2440_NAND*)0x4e000000;

volatileunsignedchar*p = (volatileunsignedchar*)&s3c2440nand->NFDATA;

return*p;

}

 

 

 

staticvoidnand_reset(void)

{

s3c2440_nand_reset();

}

 

staticvoidwait_idle(void)

{

s3c2440_wait_idle();

}

 

staticvoidnand_select_chip(void)

{

inti;

 

s3c2440_nand_select_chip();

 

for(i=0; i<10; i++);

}

 

staticvoidnand_deselect_chip(void)

{

s3c2440_nand_deselect_chip();

}

 

staticvoidwrite_cmd(intcmd)

{

s3c2440_write_cmd(cmd);

}

staticvoidwrite_addr(unsignedintaddr)

{

s3c2440_write_addr(addr);

}

 

staticvoidwrite_addr_lp(unsignedintaddr)

{

s3c2440_write_addr_lp(addr);

}

 

staticunsignedcharread_data(void)

{

returns3c2440_read_data();

}

 

 

voidnand_init_ll(void)

{

S3C2440_NAND* s3c2440nand = (S3C2440_NAND*)0x4e000000;

 

#defineTACLS 0

#defineTWRPH0 3

#defineTWRPH1 0

 

//设置时序

s3c2440nand->NFCONF= (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);

// 使能NAND Flash控制器, 初始化ECC, 禁止片选

s3c2440nand->NFCONT= (1<<4)|(1<<1)|(1<<0);

 

// 复位NAND Flash

nand_reset();

}

#if1

intNF_ReadID(void)

{

charpMID;

charpDID;

int nBuff;

char n4thcycle;

inti;

S3C2440_NAND* s3c2440nand = (S3C2440_NAND*)0x4e000000;

volatileunsignedchar*p = (volatileunsignedchar*)&s3c2440nand->NFADDR;

 

b128MB = 1;

n4thcycle = nBuff = 0;

 

nand_init_ll();

nand_select_chip();

write_cmd(0x90); // read id command

*p=0x00 & 0xff;

for( i = 0; i < 100; i++ );

 

pMID = read_data();

pDID = read_data();

nBuff = read_data();

n4thcycle = read_data();

 

nand_deselect_chip();

 

if(pDID >= 0xA0)

{

b128MB = 0;

}

 

return(pDID);

}

#endif

 

 

intnand_read_ll(unsignedchar*buf, unsignedlongstart_addr, intsize)

{

inti, j;

chardat;

S3C2440_NAND* s3c2440nand = (S3C2440_NAND*)0x4e000000;

volatileunsignedchar*p = (volatileunsignedchar*)&s3c2440nand->NFADDR;

 

 

if((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK))

{

return-1;

}

 

 

nand_select_chip();

 

for(i=start_addr; i < (start_addr + size);)

{

 

if(1){

 

write_cmd(0x50);

 

*p = 5;

for(j=0; j<10; j++);

*p = (i >> 9) & 0xff;

for(j=0; j<10; j++);

*p = (i >> 17) & 0xff;

for(j=0; j<10; j++);

*p = (i >> 25) & 0xff;

for(j=0; j<10; j++);

wait_idle();

 

dat = read_data();

write_cmd(0);

 

 

nand_deselect_chip();

if(dat != 0xff)

{

i += 16384; // 1 Block = 512*32= 16384

printf("Bad block at 0x%lx,will be skipped1n",i);

}

 

nand_select_chip();

}

 

write_cmd(0);

 

 

write_addr(i);

wait_idle();

 

for(j=0; j < NAND_SECTOR_SIZE; j++, i++)

{

*buf = read_data();

buf++;

}

}

 

 

nand_deselect_chip();

 

return0;

}

 

 

intnand_read_ll_lp(unsignedchar*buf, unsignedlongstart_addr, intsize)

{

inti, j;

chardat;

 

S3C2440_NAND* s3c2440nand = (S3C2440_NAND*)0x4e000000;

volatileunsignedchar*p = (volatileunsignedchar*)&s3c2440nand->NFADDR;

 

if((start_addr & NAND_BLOCK_MASK_LP) || (size & NAND_BLOCK_MASK_LP))

{

return-1;

}

 

 

nand_select_chip();

 

for(i=start_addr; i < (start_addr + size);)

{

 

if(1){

intcol, page;

 

col = i & NAND_BLOCK_MASK_LP;

page = i / NAND_SECTOR_SIZE_LP;

 

write_cmd(0x00);

 

*p = 5;

for(j=0; j<10; j++);

*p = 8;

for(j=0; j<10; j++);

*p = page & 0xff;

for(j=0; j<10; j++);

*p = (page >> 8) & 0xff;

for(j=0; j<10; j++);

if(b128MB == 0)

*p = (page >> 16) & 0x03;

for(j=0; j<10; j++);

 

write_cmd(0x30);

wait_idle();

 

dat = read_data();

 

 

nand_deselect_chip();

if(dat != 0xff)

{

i += 131072; // 1 Block = 2048*64= 131072

 

}

 

 

nand_select_chip();

}

 

write_cmd(0);

 

 

write_addr_lp(i);

write_cmd(0x30);

wait_idle();

 

for(j=0; j < NAND_SECTOR_SIZE_LP; j++, i++)

{

*buf = read_data();

buf++;

}

}

 

 

 

nand_deselect_chip();

 

return0;

}

 

intbBootFrmNORFlash(void)

{

volatileunsignedint*pdw = (volatileunsignedint*)0;

unsignedintdwVal;

 

 

 

dwVal = *pdw;

*pdw = 0x12345678;

if(*pdw != 0x12345678)

{

return1;

}

else

{

*pdw = dwVal;

return0;

}

}

 

intCopyCode2Ram(unsignedlongstart_addr, unsignedchar*buf, intsize)

{

unsignedint*pdwDest;

unsignedint*pdwSrc;

inti;

 

 

long*GPBCON=0x56000010;

long*GPBDAT=0x56000014;

long*GPBUP =0x56000018;

 

*GPBCON=0x295551;

*GPBUP=0xff;

*GPBDAT=0x7be;

[page]

 

 

if(bBootFrmNORFlash())

{

pdwDest = (unsignedint*)buf;

pdwSrc = (unsignedint*)start_addr;

 

for(i = 0; i < size / 4; i++)

{

pdwDest[i] = pdwSrc[i];

}

return0;

}

else

{

 

 

nand_init_ll();

 

 

if(NF_ReadID() == 0x76 )

{

nand_read_ll(buf, start_addr, (size + NAND_BLOCK_MASK)&~(NAND_BLOCK_MASK));}

else

{

nand_read_ll_lp(buf, start_addr, (size + NAND_BLOCK_MASK_LP)&~(NAND_BLOCK_MASK_LP));}

return0;

}

 

 

}

 

staticinlinevoiddelay(unsignedlongloops)

{

__asm__volatile("1:n"

"subs %0, %1, #1n"

"bne1b":"=r"(loops):"0"(loops));

}

 

 

 

#defineS3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01)) //HJ 400MHz

#defineS3C2440_MPLL_405MHZ ((0x7f<<12)|(0x02<<4)|(0x01)) //HJ 405MHz

#defineS3C2440_MPLL_440MHZ ((0x66<<12)|(0x01<<4)|(0x01)) //HJ 440MHz

#defineS3C2440_MPLL_480MHZ ((0x98<<12)|(0x02<<4)|(0x01)) //HJ 480MHz

#defineS3C2440_MPLL_200MHZ ((0x5c<<12)|(0x01<<4)|(0x02))

#defineS3C2440_MPLL_100MHZ ((0x5c<<12)|(0x01<<4)|(0x03))

 

#defineS3C2440_UPLL_48MHZ ((0x38<<12)|(0x02<<4)|(0x02)) //HJ 100MHz

 

#defineS3C2440_CLKDIV 0x05 //HJ 100MHz

#defineS3C2440_CLKDIV136 0x07 //HJ 133MHz

#defineS3C2440_CLKDIV188 0x04

#defineS3C2440_CAMDIVN188 ((0<<8)|(1<<9))

 

 

#defineS3C2440_MPLL_399MHz ((0x6e<<12)|(0x03<<4)|(0x01))

#defineS3C2440_UPLL_48MHZ_Fin16MHz ((60<<12)|(4<<4)|(2))

 

voidclock_init(void)

{

S3C24X0_CLOCK_POWER*clk_power = (S3C24X0_CLOCK_POWER*)0x4C000000;

 

 

#ifCONFIG_133MHZ_SDRAM

clk_power->CLKDIVN = S3C2440_CLKDIV136; //HJ 1:3:6

#else

clk_power->CLKDIVN= S3C2440_CLKDIV; //HJ 1:4:8

#endif

 

__asm__( "mrc p15, 0, r1, c1, c0, 0n"

"orr r1, r1, #0xc0000000n"

"mcr p15, 0, r1, c1, c0, 0n"

:::"r1"

);

 

 

clk_power->LOCKTIME= 0xFFFFFF;

 

 

clk_power->UPLLCON= S3C2440_UPLL_48MHZ; //fin=12.000MHz

// clk_power->UPLLCON = S3C2440_UPLL_48MHZ_Fin16MHz; //fin=16.934MHz

 

 

delay (4000);

 

 

clk_power->MPLLCON= S3C2440_MPLL_400MHZ; //fin=12.000MHz

// clk_power->MPLLCON = S3C2440_MPLL_405MHZ; //HJ 405MHz

// clk_power->MPLLCON = S3C2440_MPLL_440MHZ; //HJ 440MHz

// clk_power->MPLLCON = S3C2440_MPLL_480MHZ; //HJ 480MHz

// clk_power->MPLLCON = S3C2440_MPLL_399MHz; //fin=16.934MHz

 

delay (8000);

}

 

 

 

修改cpu/arm920t/s3c24x0/speed.c中get_HCLK等函数,首先在前面添加DECLARE_GLOBAL_DATA_PTR;使其能使用gd_t全局数据结构的指针

FLCK、HCLK和PCLK的关系

S3C2440有三个时钟FLCK、HCLK和PCLK

FCLK is used by ARM920T,内核时钟,主频。

HCLK is used for AHB bus, which is used by the ARM920T, the memory controller, the interrupt controller, the LCD controller, the DMA and USB host block. 也就是总线时钟,包括USB时钟。

PCLK is used for APB bus, which is used by the peripherals such as WDT, IIS, I2C, PWM timer, MMC interface,ADC, UART, GPIO, RTC and SPI.即IO接口时钟,例如串口的时钟设置就是从PCLK来的;

具体代码:

staticulongget_PLLCLK(intpllreg)

{

S3C24X0_CLOCK_POWER* constclk_power = S3C24X0_GetBase_CLOCK_POWER();

ulongr, m, p, s;

 

if(pllreg == MPLL)

r = clk_power->MPLLCON;

elseif(pllreg == UPLL)

r = clk_power->UPLLCON;

else

hang();

 

m = ((r & 0xFF000) >> 12) + 8;

p = ((r & 0x003F0) >> 4) + 2;

s = r & 0x3;

 

if(gd->bd->bi_arch_number== MACH_TYPE_SMDK2410)

return((CONFIG_SYS_CLK_FREQ * m) / (p << s));

else

return((CONFIG_SYS_CLK_FREQ * m *2) / (p << s));

}

 

 

ulongget_FCLK(void)

{

return(get_PLLCLK(MPLL));

}

 

#defineS3C2440_CLKDIVN_PDIVN (1<<0)

#defineS3C2440_CLKDIVN_HDIVN_MASK (3<<1)

#defineS3C2440_CLKDIVN_HDIVN_1 (0<<1)

#defineS3C2440_CLKDIVN_HDIVN_2 (1<<1)

#defineS3C2440_CLKDIVN_HDIVN_4_8 (2<<1)

#defineS3C2440_CLKDIVN_HDIVN_3_6 (3<<1)

#defineS3C2440_CLKDIVN_UCLK (1<<3)

 

#defineS3C2440_CAMDIVN_CAMCLK_MASK (0xf<<0)

#defineS3C2440_CAMDIVN_CAMCLK_SEL (1<<4)

#defineS3C2440_CAMDIVN_HCLK3_HALF (1<<8)

#defineS3C2440_CAMDIVN_HCLK4_HALF (1<<9)

#defineS3C2440_CAMDIVN_DVSEN (1<<12)

 

ulongget_HCLK(void)

{

S3C24X0_CLOCK_POWER* constclk_power = S3C24X0_GetBase_CLOCK_POWER();

unsignedlongclkdiv;

unsignedlongcamdiv;

inthdiv = 1;

 

 

clkdiv = clk_power->CLKDIVN;

camdiv = clk_power->CAMDIVN;

 

 

if(gd->bd->bi_arch_number== MACH_TYPE_SMDK2410)

return((clk_power->CLKDIVN& 0x2) ? get_FCLK()/2 : get_FCLK());

else

{

switch(clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {

caseS3C2440_CLKDIVN_HDIVN_1:

hdiv = 1;

break;

 

caseS3C2440_CLKDIVN_HDIVN_2:

hdiv = 2;

break;

 

caseS3C2440_CLKDIVN_HDIVN_4_8:

hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;

break;

 

caseS3C2440_CLKDIVN_HDIVN_3_6:

hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;

break;

}

 

returnget_FCLK() / hdiv;

}

}

 

 

ulongget_PCLK(void)

{

S3C24X0_CLOCK_POWER* constclk_power = S3C24X0_GetBase_CLOCK_POWER();

unsignedlongclkdiv;

unsignedlongcamdiv;

inthdiv = 1;

 

 

clkdiv = clk_power->CLKDIVN;

camdiv = clk_power->CAMDIVN;

 

 

if(gd->bd->bi_arch_number== MACH_TYPE_SMDK2410)

return((clk_power->CLKDIVN& 0x1) ? get_HCLK()/2 : get_HCLK());

else

{

switch(clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {

caseS3C2440_CLKDIVN_HDIVN_1:

hdiv = 1;

break;

 

caseS3C2440_CLKDIVN_HDIVN_2:

hdiv = 2;

break;

 

caseS3C2440_CLKDIVN_HDIVN_4_8:

hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;

break;

 

caseS3C2440_CLKDIVN_HDIVN_3_6:

hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;

break;

}

 

returnget_FCLK() / hdiv / ((clkdiv & S3C2440_CLKDIVN_PDIVN)? 2:1);

}

}

关键字:U-boot1  6  TQ2440开发板 引用地址:U-boot1.1.6移植到TQ2440开发板(上)

上一篇:关于STM32的反省,不做烦躁的嵌入式工程师
下一篇:U-boot1.1.6移植到TQ2440开发板(下)

推荐阅读最新更新时间:2024-03-16 14:38

南通一期Q1营收2.2亿 5G用PCB已进入批量阶段
深南电路发布投资者调研相关信息表示,2019年一季度毛利率相比2018年四季度略有下滑,主要是因为一季度存在春节放假停工,以及在放假期间进行集中的智能化改造。 对此,深南电路表示,毛利率是收入与成本综合作用的结果,与客户订单情况也息息相关。公司会通过产品结构优化、专业化产线调整、智能化工厂普及等举措持续挖掘内部成本改善空间,提高工厂运营效率,力争提升毛利率水平。 在5G领域,深南电路在一季度以来,5G用PCB进入小批量阶段,少部分已进入批量阶段,收入占比有所提升。 关于南通一期、二期项目建设,深南电路披露,目前,公司南通一期PCB工厂产能爬坡进度顺利,截至2019年3月31日产能利用率已经达到90%以上。2019年一季
[手机便携]
AVR timer1PWM设置
简介:PWM是啥,不多说自己网络上搜索,PWM调节在控制方面使用很广泛,利用PWM控制方式可以使得电路简单可靠,芯片体积也会很小。下面看看AVR的PWM输出控制吧。 void timer1_pwm() { TCCR1A=(1 COM1A1)|(1 COM1B1)|(1 WGM11)|(0 WGM10); //比较输出模式,快速PWM,比较匹配时清零OC1A/B,OC1A/B在TOP时置位。 TCCR1B=(1 WGM13)|(1 WGM12)|(1 CS12)|(0 CS11)|(1 CS10); //模式14,快速PWM,计数上限由ICR1确定,1024分频。 ICR1H = 0x00; //
[单片机]
AVR timer<font color='red'>1</font>PWM设置
西高投宫蒲玲:从1亿到100亿,投资快准狠
利落大方、平易近人是西高投董事长宫蒲玲给人的第一印象,她性格中既有西北人的豪爽,言辞中也透露着敢打敢拼的决心和狠劲儿。 从2014年“临危受命”至今,宫蒲玲毫不掩饰自己的“野心”——“重振雄风,扛起西部创投的大旗,并使得西高投跻身国内一流创投机构行列。” 4年来,伴随着西高投的快速发展,一开始的焦虑逐渐转化为涅槃的动力,宫蒲玲在公司管理上更加游刃有余。从看似平静的言谈中,可以窥见她的自我超越和日益壮大的西高投版图。 “二次创业”:从1亿到100亿 “重新打造西高投,必须要有二次创业。”回忆起2014年,宫蒲玲语气十分坚定。 西高投(西安高新技术产业风险投资有限责任公司)并不是一家年轻的机构。早在1991年,刚成立的西安高新
[半导体设计/制造]
TE 公布2021财年Q1财报,净销售额为35亿美元
近日,TE Connectivity(以下简称“TE”)公布了截至2020年12月25日的第一季度财报。 第一财季亮点 净销售额为35亿美元,较2020财年第一季度同比增长11%,自然增长6%。 总订单额约达40亿美元,与去年同期相比增长25%。 持续经营业务产生的GAAP每股收益为1.13美元。调整后每股收益为1.47美元,同比增长21%。 持续经营业务产生的现金流达6.4亿美元,自由现金流达5.29亿美元,返还股东2.86亿美元。 TE Connectivity首席执行官Terrence Curtin先生表示:“TE 2021财年第一季度的销售额和每股收益同比实现了两位数增长,超出公司预期。这一强劲的业绩表现显示
[半导体设计/制造]
消息称苹果将推游戏手柄:为Apple TV 6准备
据外媒最新消息称,苹果即将推出一款有趣的新品,而它可能成为2020年新款Apple TV的选装配件,有助于增加Apple Arcade的用户群。   爆料中提到,新的苹果游戏控制器将 “比Atmark控制器更先进”,并表示其发布时间点将在明年。这意味着,传闻中搭载A12X Bionic的2020年Apple TV很可能不会将这款游戏控制器作为其配件捆绑的一部分。   新的游戏控制器用Lightning线充电并不值得惊讶,因为苹果还没有准备好放弃其专有端口。虽然我们更愿意听到苹果游戏控制器将通过USB-C线充电。   兼容Qi无线充电板的智能手机需要有一个玻璃背板才能启动无线感应过程,那么这是否意味着苹果游戏控制器也会采用玻璃背
[手机便携]
RedsSn0w更新支持iOS 6 b3越狱
      苹果今天凌晨发布了新一轮的iOS 6测试版(点击进入),相信许多朋友现在已经完成下载安装,并且摸清新版本带来的主要改动了。与此同时,iPhone Dev Team也在第一时间发布了RedSn0w更新,目前版本已经升级至0.9.13 dev3,主要添加iOS 6 Beta 3的支持。    正如RedSn0w大多数版本的更新一样,0.9.13 dev3带来的依旧只是不完美越狱,依旧只支持A4设备,所以我们还是要提醒已经完成越狱的iPhone 4S、New iPad用户不要轻易尝试iOS 6 Beta版本的更新。根据预测,iOS 6正式版将会在今秋到来(9-10月),而pod2g等知名黑客也已经在此磨拳擦掌,相信
[手机便携]
互联网大国到强国 IPv6能否为我国打开新空间
   IPv6 持续走红,很大程度源于去年年底的一份文件。下面就随手机便携小编一起来了解一下相关内容吧。   “说它是一个划时代意义的历史性文件,我觉得一点都不为过。”时值隆冬,京城温度已降至零下十几摄氏度,但谈及去年年底中办、国办印发的《推进互联网协议第六版( IPv6 )规模部署行动计划》(以下简称《计划》),经历近十年技术胶着“寒冬”的中国工程院院士、清华大学教授吴建平7日在接受科技日报记者专访时表示,已充满对行业春天的期盼,“《计划》澄清了技术上的迷茫观点,指明了前进的方向”。   互联网的核心技术是包含统一协议标准在内的体系结构,这也被认为是互联网强国的重要判断标准之一。   最近统计数据显示,在8000多个互联网标准
[手机便携]
CRT3-6轴抛光运动控制系统工件加工编辑方法及步骤
科瑞特DMC600系列是一款多功能的运动控制系统,主要应用于焊接、抛光、机械手等设备。实现多轴联动,多种插补,如:直线、圆弧、抛物线、螺旋线插补等。下面以3轴抛光示教系统为例,举例工件加工的编辑方法及步骤。图 1 是加工工件的运动轨迹。 P1 到 P14 这 14 个点是工件工艺动作要求: 1、开机运行磨机下降到位 P1 点(角度调整,磨机打开,速度,延时); 2、移动到 P2 点(延时); 3、磨机上升到 P3 点; 4、平移到 P4 点(角度调整); 5、磨机下降到 P5 点(延时); 6、移动到 P6 点(延时); 7、磨机上升到 P7 点(角度调整); 8、磨机下降到 P8 点(延时); 9、移动到 P9 点(延时);
[嵌入式]
CRT3-<font color='red'>6</font>轴抛光运动控制系统工件加工编辑方法及步骤
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved