观照的英文译语怎么说-六级作文常用句型


2023年4月5日发(作者:中小学教师继续教育网)

1、初始化函数序列数组



init_fnc_t *init_sequence[] = {

#if defined(CONFIG_CQ8401)

clx_board_init, /* init gpio/clocks/dram etc. */

#endif

timer_init,

env_init, /* initialize environment */

#ifdef CONFIG_INCA_IP

incaip_set_cpuclk, /* set cpu clock according to environment variable */

#endif

init_baudrate, /* initialze baudrate settings */

serial_init, /* serial communications setup */

console_init_f,

displ小雅采薇原文及翻译 ay_banner, /* say that we are here */

checkboard,

init_func_ram,

NULL,

};





这个宏 CONFIG_INCA_IP 定义,是 开发板incaip,定义的宏,CQ8401 没有定义,所以

incaip_set_cpuclk()函数不执行。



#####################################################################################



2、clx_board_init()函数





位于cpu/mips/cq8401.c文件中。



int clx_board_init(void)

{

board_early_init小池宋杨万里古诗原文 (); /* init gpio, pll etc. */

calc_clocks(); /* calc the clocks */

sdram_init(); /* init sdram memory */

check_reset(); /* check the reset status */

return 0;

}





################################################道德经朗读完整版 #####################################



2-1 board_early_init() 函数



位于board/mingddie/mingddie.c文件中。



board_early_init (void)

{

char *argptr;



clx_soc_setup ();

clx_board_setup (); /* defined in arch/mips/clxsoc/yyy/setup.c */

}



2-1-1 clx_soc_setup() 函数



clx_soc_setup (void)

{

soc_cpm_setup ();

soc_harb_setup ();

soc_emc_setup ();

soc_dmac_setup ();

soc_pcic_setup ();

}





2-1-1-1



static void

soc_cpm_setup (void)

{

__cpm_idle_mode ();

__cpm_enable_cko ();

__cpm_start_all ();

pll_init ();

/* get system clocks */

// sysclocks_setup();

}

该函数设置了CQ8401 SOC的Clock和 Power Manage单元。

__cpm_idle_mode () 设置 CQ8401 SOC 为IDLE模式。(参考CQ8401 Datesheet P190)

__cpm_enable_cko () 设置 使能 CKO 输出,这个为SDRAM 的时钟。

__cpm_start_all () 设置 MODULE-STOP Register 使能所有的模块。

pll_init ()函数初始化 PLL。

设置了Clock Frequency Control Register (CFCR)寄存器,

CKO使能,USB时钟选择外部,CCLK、HCLK、PCLK和MCLK设置。

设置了PLL Control Register (PLCR) 寄存器,

PLLFD、PLLRD = 0、PLLOD = 0、PLLST = 0x20,并使能PLL。







2-1-1-2

static void

soc_harb_setup (void)

{

__harb_set_priority (0x03); /* LCD>CIM>DMA>ETH>PCI>USB>CBB */

}



??????????????????include/asm-mips/global_data.h?????????

没有找到这个地址。



2-1-1-3

static void

soc_emc_setup (void)

{

}

什么也没有作。





2-1-1-4



static void

soc_dmac_setup (void)

{

__dmac_enable_all_channels ();

}

设置DMA的控制寄存器,使能所有的DMA通道,并设置DMA

通道的优先级为循环模式。





2-1-1-5

soc_pcic_setup ()函数设置PCI控制器。









2-1-2 clx_board_setup() 函数



clx_board_setup (void)

{

board_cpm_setup ();

board_gpio_setup ();

}



2-1-2-1



static void

board_cpm_setup (void)

{

__cpm_start_uart (1);

__cpm_start_aic (1);

__cpm_start_aic (2);

__cpm_start_uhc ();

}

源代码有错,

设置了CPM单元的MODULE-STOP Register (MSCR寄存器),

使能了串口1,AIC1、AIC2和海内风尘诸弟隔 UHC模块。





2-1-2-1

static void

board_gpio_setup (古朗月行注音版的诗句 void)

{



这个函数设置了CQ8401的GPIO的使用。



把GPIO 引脚设置为 EMC模块、PCI模块、UART1模块、UART2模块、MA模块等等使用







#####################################################################################







2-2 calc_clocks() 函数





static void calc_clocks(void)

{

DECLARE_GLOBAL_DATA_PTR;



这个函数首先使用宏定义 DECLARE_GLOBAL_DATA_PTR 定义了 gd_t结构体类型的指针,在寄存器 k0 中,

这个指针为在 board_init_f 中进行了定义,这个函数直接使用。



nf = __cpm_plcr1_fd() + 2;

nr = __cpm_plcr1_rd() + 2;

nd = od[__cpm_plcr1_od()];



这三个步骤得到 PLL Control Register (PLCR 寄存器)中的三个值



Input Divider value N: N = PLLRD + 2

— Feedback Divider Value M: M = PLLFD + 2

— Output Divider Value NO: NO = PLLOD



pllout = (CFG_EXTAL / (nr * nd)) * nf;

再有公式 CLK_OUT = XIN * (M / N ) * (1/ NO)

得到PLL单元的输出频率。



gd->cpu_clk = pllout / div[__cpm_cfcr_ifr()];

gd->sys_clk = pllout / div[__cpm_cfcr_sfr()];

gd->per_clk = pllout / div[__cpm_cfcr_pfr()];

gd->mem_clk = pllout / div[__cpm_cfcr_mfr()];

gd->dev_clk = CFG_EXTAL;



最后对 gd_t 结构体赋值。















#####################################################################################





2-2 sdram_init() 函数

这个函数进行了 SDRAM 的初始化操作。



我们可以先看一下 SDR经典古诗词名篇 AM 启动时的默认值。

(1)SDRAM Control Register (DMCR寄存器) == 0x00000000



BW [31]: 指定数据总线宽度。初始为0, 即 32-位的数据总线宽度。

CA [28:26]: 能够设置 8位 ~12位 COLMN 地址宽度。初始为 8 位宽。

RMODE [25]: 刷新模式选择, 0- Auto-refresh, 1-Self-refresh

RFSH [24]: 刷新控制位, 0-refresh is performed 1-Refresh is performed

MRSET [23]: 当 SDRAM mode register 设置,此位为 0 ,则执行 PALL(预充电所有bank)命令。

此位为 1, 则执行 MRS (mode register set)命令。



RA [21:20]: 能够设置SDRAM的 ROW 地址宽度为 11、12、13。初始为 11 位宽。

BA [19]: 每个 CHIP 有 几个 BANK。初始为 2 BANK。



EPIN [17]: 发送 power-down-exit 命令。

PDM [18]: 设

置 Power Down 模式, 1-设置

TRAS [15:13]: RAS Assertion Time 设置内存的行地址刷新时间周期

对质量好的内存可以延迟刷新,从而提高系统性能。

RCD [12:11]: RAS–CAS Delay 行地址触发信号到列地址触发信号之间的延迟时间。

通常是RAS#下降到CAS#下降之间的时间。

TPC [10:8]: RAS Pre-charge Time 内存行地址信号预先充电所需要的时间。

tt设定当RAS(行地址信号)需要重新寻址时,要隔多久时间才能开始下次的寻址动作,

通常被视为RAS的充电时间,理论上是越短越好。

其选项值与上面讲到的一样,所以建议将其设定为2T(2个Clock周期),

这样可以将内存性能提高;若发现系统运行不稳定,再将其改回3T。

TRWL [6:5] : Write Pre-charge Time 见 P110,是指在写周期之后,有几个周期的等待时间,才能发bank active命令

TRC [4:2]: RAS Cycle Time,t在auto-refresh命令之后,几个周期内没有 bank active命令 == TRAS + TPC

TCL [1:0]: CAS Latency,指在读命令发出之后,数据到达数据总线的时间延时。







(2)SDRAM Mode Register (SDMR寄存器) == 未定义





(3) Refresh Timer Control/Status Register (RTCSR 寄存器) == 0x0000

CMF [7]:表明 refresh timer counter (RTCNT寄存器) 和 refresh time constant register

(RTCOR寄存器)中的值是否匹配

CKS [2:0]:选择 refresh timer counter (RTCNT寄存器)的计数频率,为 CK0 的整数分之一。

初始化为 0 ,表明没有时钟输入。



(4) refresh timer counter (RTCNT寄存器) == 0x0000



(5)refresh time constant register (RTCOR寄存器) == 0x0000

当 DMCR寄存器的 RFSH域设置为 1 时, 为自动刷新模式,当这两个寄存器中的值相等时,开始刷新周期。

(RTCNT寄存器)为计数递增寄存器。

(RTCOR寄存器)为常量存储寄存器。



(6)DRAM Bank Address Configuration Register(DMAR寄存器)t== 0x000020F8

BASE [15:8] :定义 SDRAM Bank 的基地址。

MASK [7 :0] :定义 SDRAM Bank 的掩码。







static void sdram_init(void)

{

DECLARE_GLOBAL_DATA_PTR;

这个函数首先使用宏定义 DECLARE_GLOBAL_DATA_PTR 定义了 gd_t结构体类型的指针,在寄存器 k0 中,

这个指针为在 board_init_f 中进行了定义,这个函数直接使用。



REG_EMC_BCR = EMC_BCR_BRE;

设置Bus Control Register (BCR寄存器) 使能 Bus Release Enable。



REG_EMC_RTCSR = EMC_RTCSR_CKS_DISABLE;

设置Refresh Timer Control/Status Register (RTCSR 寄存器) == 0



REG_EMC_RTCOR = 0;

REG_EMC_RTCNT = 0;

当 DMCR寄存器的 RFSH域设置为 1 时, 为自动刷新模式,当这两个寄存器中的值相等时,开始刷新周期。

(RTCNT寄存器)为计数递

增寄存器。

(RTCOR寄存器)为常量存储寄存器。











ns = 1000000000 / gd->mem_clk;

得出一个CKO时钟周期是 多少纳秒。

tmp = SDRAM_TRAS/ns; 得出 TRAS == 几个时钟周期。

dmcr |= ((tmp-4) << EMC_DMCR_TRAS_BIT);

设置 TRAS == tmp

tmp = SDRAM_RCD/ns; 得出 RCD == 几个时钟周期。

dmcr |= (tmp << EMC_DMCR_RCD_BIT);

设置 RCD == tmp

tmp = SDRAM_TPC/ns; 得出 TPC == 几个时钟周期。

设置 TPC == tmp

tmp = SDRAM_TRWL/ns; 得出 TRWL == 几个时钟周期。

dmcr |= (tmp << EMC_DMCR_TRWL_BIT);

设置 TRWL == tmp

tmp = (SDRAM_TRAS + SDRAM_TPC)/ns; 得出 TRC == 几个时钟周期。

dmcr |= (((tmp + 1) >> 1) << EMC_DMCR_TRC_BIT);

设置 TRC == TRAS + TPC



REG_EMC_DMCR = dmcr;

设置SDRAM Control Register (DMCR寄存器),dmcr的值在前面进行了赋值。

设置为 ROW = 13,COL = 9,4个BANKS,32位宽,使能CKE,TCL = 2, MRSET == 0

因为 MRSET == 0,所以 执行 PALL 命令,即预充电所有bank。







REG_EMC_RTCOR = tmp;

设置(RTCOR寄存器)为常量存储寄存器。



REG_EMC_RTCSR = EMC_RTCSR_CKS_64; /* Divisor is 64, CKO/64 */

选择 refresh timer counter (RTCNT寄存器)的计数频率,为 CK0 的整数64 分之一。



sdmode = EMC_SDMR_BT_SEQ |

EMC_SDMR_OM_NORMAL |

EMC_SDMR_BL_4 |

cas_latency_sdmr[((SDRAM_CASL == 3) ? 1 : 0)];



#define EMC_SDMR_BT_SEQ (0 << 3)

#define EMC_SDMR_OM_NORMAL (0 << 7) (op mode) normal operating mode

#美人卷珠帘深坐颦蛾眉 define EMC_SDMR_BL_4 (2 << 0)

#define EMC_SDMR_CAS_2 (2 << 4)



即 sdmode == 0H



if (SDRAM_BW16)

sdmode <<= 1;

else

sdmode <<= 2;



当 16 位宽时,左移 1 位,当 32 位宽时,左移 2 位。







/* precharge all chip-selects */

REG8(EMC_SDMR0|sdmode) = 0;

REG8(EMC_SDMR1|sdmode) = 0;

设置SDRAM Mode Register (SDMR寄存器),Mode Register一般被用于定义SDRAM运行的模式。

???????????????????????



REG_EMC_DMCR = dmcr | EMC_DMCR_RFSH | EMC_DMCR_MRSET;

设置??????????????





REG8(EMC_SDMR0|sdmode) = 0;

REG8(EMC_SDMR1|sdmode) = 0;



最后对内存进行检查。如果不正确,进行死循环。









#####################################################################################



2-3 check_reset(void) 函数



static void check_reset(void)

{

if (REG_CPM_RSTR & 0x4) {

/* CPU was reset by hibernate wakeup */

void (*resume) (void);



/* Clear HGP */

REG_CPM_SCR &= ~CPM_SCR_HGP;



/* Jump to sleep address directly */

resume = (void (*)(void))(REG_CPM_SPR | 0x80000000);

resume();

}

}



这个函数主要是检查 CPU 的启动方式。

根据

具体的启动方式,来进行检测。



但是对于 CQ8401 芯片来书,这个函数是错误的。

???????????????









#####################################################################################



3、 timer_init()函数 (这个函数移植时需要自己编写)



位于 cpu/mips/cq8401.c 文件中。



int timer_init(void)

{

__ost_set_clock(CHANNEL_ID, OST_TCSR_CKS_EXTAL);

设置 OST 单元的输入时钟频率,OTCSR)寄存器的 CKC 位为 EXCLK。



__ost_set_reload(CHANNEL_ID, TIMER_LOAD_VAL);

在OTDR 寄存器中,写入一个初始化数据



__ost_set_count(CHANNEL_ID, TIMER_LOAD_VAL);

数据自动加载到 OTCNT 寄存器



__ost_enable_channel(CHANNEL_ID);

使能这个 OST 通道。



lastdec = TIMER_LOAD_VAL;

timestamp = 0;

两个全局变量进行赋值。

return 0;

}



硬件原理:对于 OST 来书,原理很简单,操作也简单。

先把相对应的 OST 通道关闭,清除 OTER 寄存器的 OTE位。

在设置 硕鼠硕鼠无食我黍什么意思 OST 单元的输入时钟频率,即选择 Timer Control Register (OTCSR)寄存器的 CKC 位。

决定在是否发生中断, (OTCSR)寄存器的 UIE 位,决定的。

在OTDR 寄存器中,写入一个初始化数据,这个数据自动加载到 OTCNT 寄存器中,从这个数据递减,当这个数据溢出时,就会发生,OTDR 寄存器重小荷才露尖尖角的露读音 新加载到 OTCNT 寄存器, (OTCSR)寄存器的 CF 位自动 置 1。

等待 (OTCSR)寄存器的 CF 位清 0,即OTDR 寄存器重新加载到 OTCNT 寄存器









#####################################################################################



4、 env_init()函数 (不用自己写,移植不相关)



初始化环境变量, 具体要看用什么介质来存储环境变量,如果用flash来存贮, 程序在common/env_flash.c中.



有多个 env_init() 函数,在common目录下的env_nand.c env_dataflash.c env_flash.c env_eeprom.c

env_nvram.c env_nowhere.c 这个文件中都定义了这个函数。



在这几个文件的开头定义了下面这几个宏之一,决定了使用那种介质来存储环境变量的。

这个宏在include/configs/目标板名称.h 文件中定义的。

CFG_ENV_IS_IN_DATAFLASH 这个宏定义了 环境变量 是 Environment is in DataFlash

CFG_ENV_IS_IN_EEPROM /* Environment is in EEPROM */

CFG_ENV_IS_IN_FLASH /* Environment is in Flash */

CFG_ENV_IS_IN_NAND /* Environment is in Nand Flash */

CFG_ENV_IS_NOWHERE /* Environment is nowhere */

CFG_ENV_IS_IN_NVRAM /* Environment is in NVRAM */





而对于 CQ8401 来说,是使用 Flash 来存储的,代码为env_flash.c中的代码。





CFG_ENV_SIZE_REDUND

These settings describe a second storage area used to hold

a redundant copy of the environment data, so that there is

a valid backup copy in case there is a po

wer failure during

a \"saveenv\" operation.



在这个文件中定义了两个这个函数 , 由宏定义 CFG_ENV_SIZE_REDUND 来确定,走那个函数。

上面解释了这个宏的含义。一般的板子不用定义这个宏。



int env_init(void)

{

DECLARE_GLOBAL_DATA_PTR;

这个函数首先使用宏定义 DECLARE_GLOBAL_DATA_PTR 定义了 gd_t结构体类型的指针,在寄存器 k0 中,

这个指针为在 board_init_f 中进行了定义,这个函数直接使用。





if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc)

{

检测 Environment 数据 CRC32 checksum 是否有效,无效的话使用默认的环境变量。

gd->env_addr = (ulong)&(env_ptr->data);

gd->env_valid = 1;

return(0);

}



gd->env_addr = (ulong)&default_environment[0];

gd->env_valid = 0;

return (0);



gd->env_addr 成员是 Environment struct 的基地址。

gd->env_valid 成员是 Environment CRC32 checksum 是否有效。



}



这个函数中由宏 CONFIG_OMAP2420H4 来确定 是否是OMAP2420H4开发板, 我们没有定义这个宏。不执行这段代码。

所以去掉了宏定义之中的代码。



在这个文件的头部定义了全局变量 env_ptr ,即环境变量的数组的指针。





#ifdef ENV_IS_EMBEDDED



extern uchar environment[];

env_t *env_ptr = (env_t *)(&environment[0]);



#ifdef CMD_SAVEENV

/* static env_t *flash_addr = (env_t *)(&environment[0]);-broken on ARM-wd-*/

static env_t *flash_addr = (env_t *)CFG_ENV_ADDR;

#endif



#else /* ! ENV_IS_EMBEDDED */



env_t *env_ptr = (env_t *)CFG_ENV_ADDR;

#ifdef CMD_SAVEENV

static env_t *flash_addr = (env_t *)CFG_ENV_ADDR;

#endif



#endif /* ENV_IS_EMBEDDED */



对于 CQ8401 开发板来说 没有定义 ENV_IS_EMBEDDED ,

所以 evn_ptr = CFG_ENV_ADDR ,CFG_ENV_ADDR 这个宏在include/configs/mingddie.h 文件中。









#####################################################################################







5、 init_baudrate()函数 (不用自己写,移植不相关)



位于 lib_mips/board.c 文件中。



static int init_baudrate (void)

{

DECLARE_GLOBAL_DATA_PTR;

这个函数首先使用宏定义 DECLARE_GLOBAL_DATA_PTR 定义了 gd_t结构体类型的指针,在寄存器 k0 中,

这个指针为在 board_init_f 中进行了定义,这个函数直接使用。





uchar tmp[64]; /* long enough for environment variables */

int i = getenv_r (\"baudrate\", tmp, sizeof (tmp));

从环境变量中获得 baudrate 这个成语的值。



gd->baudrate = (i > 0)

? (int) simple_strtoul (tmp, NULL, 10)

: CONFIG_BAUDRATE;

当 getenv_r() 函数的返回制 小于 0 时, 为getenv_r()这个函数不能够从 环境变量数组中获得 变量值。

使用 CONFIG_BAUDRATE 宏定义的值来 指明 gd_t 结构体 baudrate 成员的值。





getenv_r() 函数的返回制 不小于 0 时,由 环境变量数组中获得 的 变量值,指明 gd_t 结构体 baudrate 成员的值。





return (0);

}



**********************************************************



5-1





int getenv_r (uchar *name, uchar *buf, unsigned len)

{

int i, nxt;



for (i=0; env_get_char(i) != \'0\'; i=nxt+1) {

int val, n;



for (nxt=i; env_get_char(nxt) != \'0\'; ++nxt) {

if (nxt >= CFG_ENV_SIZE) {

return (-1);

}

}

if ((val=envmatch(name, i)) < 0)

continue;

/* found; copy out */

n = 0;

while ((len > n++) && (*buf++ = env_get_char(val++)) != \'0\')

;

if (len == n)

*buf = \'0\';

return (n);

}

return (-1);

}



环境变量数组实际上是一个 无符号的 字符型大数组,它是有 多个 字符串 组成的。

env_get_char(nxt)函数 在 common/env_common.c 文件中进行了定义。

它实际是一个全局变量,是一个函数指针,指向 env_get_char_init 函数,

env_get_char_init 函数 在 common/env_common.c 定义的。





这个函数当错误时返回 (-1),正确时返回 这个变量的长度。







#####################################################################################



6、 serial_init()函数 (移植相关代码,需要自己写)



许多开发板定义了 serial_init()函数,具体调用那个文件中定义的 serial_init()函数。

是由于 在 clx_serial.c 文件开头,由宏定义 CONFIG_CQ8401 来确定的。





int serial_init (void)

{

具体的代码与硬件相关。



















#####################################################################################



6、 console_init_f()函数 (不用自己写,移植不相关)





位于 common/console.c 文件中。





int console_init_f (void)

{

DECLARE_GLOBAL_DATA_PTR;

这个函数首先使用宏定义 DECLARE_GLOBAL_DATA_PTR 定义了 gd_t结构体类型的指针,在寄存器 k0 中,

这个指针为在 board_init_f 中进行了定义,这个函数直接使用。





gd->have_console = 1;

gd->have_console成员表明 serial_init() 函数 已经 被调用过。



#ifdef CONFIG_SILENT_CONSOLE

if (getenv(\"silent\") != NULL)

gd->flags |= GD_FLG_SILENT;

#endif



return (0);

}



由于标准设备还没有初始化(gd->flags & GD_FLG_DEVINIT=0),这时控制台使用串口作为控制台

函数只有一句:gd->have_console = 1;







#####################################################################################



7、 display_banner()函数 (移植相关代码,需要自己写





该函数与具体硬件没有关系,只是显示了 企业 的 LOGO,或者硬件描述性的语言。

也可以为 空 函数。





从这个函数开始才在控制台输出信息的。(这是一个重要的分界点)





这个函数主要调用 printf() 来进行输出的。



****************************************



7-1 printf() 函数的实现



这个函数 位于 common/console.c 文件中



void printf (const char *fmt, ...)

{

va_list args;

uint i;

char printbuffer[CFG_PBSIZE];



va_start (args, fmt);



/* For this to work, printbuffer must be larger than

* anything we ever want to print.

*/

i = vsprintf (printbuffer, fmt, args);

va_end (args);



/* Print the string */

puts (printbuffer);

}



先使用标准 C 库函数 vsprintf()把数据重新定向到 一个 Buffer 中,

再调用 puts()函数,输出到串口。这个函数下面进行了描述。







#####################################################################################



8、 checkboard (void) 函数 (移植相关代码,需要自己写)



int checkboard (void)

{

DECLARE_GLOBAL_DATA_PTR;



printf (\"Board: Clx Mingddie (CPU Speed %d MHz)
\",

gd->cpu_clk / 1000000);



return 0;

}



该函数描述了 开发板一些的配置信息。









#####################################################################################



9、ttinit_func_ram (void) 函数



位于 lib_mips/board.c 文件中。



static int init_func_ram (void)

{

DECLARE_GLOBAL_DATA_PTR;



#ifdef CONFIG_BOARD_TYPES

int board_type = gd->board_type;

#else

int board_type = 0; /* use dummy arg */

#endif



puts (\"DRAM: \");

串口 输出 字符串 “DRAM: ”。



if ((gd->ram_size = initdram (board_type)) > 0) {

print_size (gd->ram_size, \"
\");

return (0);

}

puts (failed);

return (1);

}



这个 CONFIG_BOARD_TYPES 宏定义,是说明 gd_t 结构体是否支持 board_type 成员。



明 gd_t 结构体的成员 ram_size 表示 RAM 的大小。





*********************************************



9-1 puts () 函数 (此函数调用 serial_puts()函数,移植相关,自己编写)





位于 common/console.c 文件中。



void puts (const char *s)

{

DECLARE_GLOBAL_DATA_PTR;



#ifdef CONFIG_SILENT_CONSOLE

if (gd->flags & GD_FLG_SILENT)

return;

#endif



if (gd->flags & GD_FLG_DEVINIT) {

/* Send to the standard output */

fputs (stdout, s);

} else {

/* Send directly to the handler */

serial_puts (s);

}

}



由于标准设备

还没有初始化(gd->flags & GD_FLG_DEVINIT=0),这时控制台使用串口作为控制台

调用 serial_puts (s) 函数。



这个函数需要 自己 编写,是移植相关的函数。



对于 CQ8401 开发板来说,定义在 board/mips/clx_serial.c 文件中。





*********************************************





9-1 initdram () 函数 (移植相关代码,需要自己写)



这个函数获得 SDRAM 的大小,并返回。





对于 CQ8401 开发板来书,在 cpu/mips/cq8401.c 文件中实现的。



long int initdram(int board_type)

{

u32 dmcr;

u32 rows, cols, dw, banks;

ulong size;



dmcr = REG_EMC_DMCR;

rows = 11 + ((dmcr & EMC_DMCR_RA_MASK) >> EMC_DMCR_RA_BIT);

cols = 8 + ((dmcr & EMC_DMCR_CA_MASK) >> EMC_DMCR_CA_BIT);

dw = (dmcr & EMC_DMCR_BW) ? 2 : 4;

banks = (dmcr & EMC_DMCR_BA) ? 4 : 2;



size = (1 << (rows + cols)) * dw * banks;



return size;

}













#####################################################################################



























更多推荐

clocks是什么意思cks在线翻译读音例句