www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]Ok6410的硬件相比mini6410強(qiáng)大許多(同樣的價(jià)錢(qián)),但是ok6410的uboot制作用起來(lái)不方便,需要輸入很多命令才可以燒寫(xiě)完一個(gè)系統(tǒng)。我還是比較懷念在2440上方便、靈活的燒寫(xiě)方式。 下面我們就來(lái)修改出一個(gè)簡(jiǎn)單的uboot

Ok6410的硬件相比mini6410強(qiáng)大許多(同樣的價(jià)錢(qián)),但是ok6410的uboot制作用起來(lái)不方便,需要輸入很多命令才可以燒寫(xiě)完一個(gè)系統(tǒng)。我還是比較懷念在2440上方便、靈活的燒寫(xiě)方式。
下面我們就來(lái)修改出一個(gè)簡(jiǎn)單的uboot,實(shí)現(xiàn)快速更新系統(tǒng)。
一、首先簡(jiǎn)單的說(shuō)明uboot的啟動(dòng)過(guò)程:
1)、從文件層面上看主要流程是在兩個(gè)文件中:cpu/xxxx/start.s,lib_arm/board.c。
Start.s
在flash中執(zhí)行的引導(dǎo)代碼,也就是bootloader中的stage1,負(fù)責(zé)初始化硬件環(huán)境,把u-boot從flash加載到RAM中去,然后跳到lib_arm/board.c中的start_armboot中去執(zhí)行。
1.1.6版本的start.s流程:
硬件環(huán)境初始化:
進(jìn)入svc模式-->關(guān)閉watch dog-->屏蔽所有IRQ掩碼-->設(shè)置時(shí)鐘頻率FCLK、HCLK、PCLK-->清I/D cache-->禁止MMU和CACHE-->配置memory control-->重定位:如果當(dāng)前代碼不在連接指定的地址上(對(duì)smdk2410是0x3f000000)則需要把u-boot從當(dāng)前位置拷貝到RAM指定位置中;-->建立堆棧,堆棧是進(jìn)入C函數(shù)前必須初始化的。-->清.bss區(qū)。-->跳到start_armboot函數(shù)中執(zhí)行。(lib_arm/board.c)
2)、lib_arm/board.c:
start_armboot是U-Boot執(zhí)行的第一個(gè)C語(yǔ)言函數(shù),完成系統(tǒng)初始化工作,進(jìn)入主循環(huán),處理用戶(hù)輸入的命令。這里只簡(jiǎn)要列出了主要執(zhí)行的函數(shù)流程:
void start_armboot (void)
{
//全局?jǐn)?shù)據(jù)變量指針gd占用r8。
DECLARE_GLOBAL_DATA_PTR;
/* 給全局?jǐn)?shù)據(jù)變量gd安排空間*/
gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
memset ((void*)gd, 0, sizeof (gd_t));
/* 給板子數(shù)據(jù)變量gd->bd安排空間*/
gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
memset (gd->bd, 0, sizeof (bd_t));
monitor_flash_len = _bss_start - _armboot_start;//取u-boot的長(zhǎng)度。
/* 順序執(zhí)行init_sequence數(shù)組中的初始化函數(shù) */
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr)
if ((*init_fnc_ptr)() != 0) { hang ();}
/*配置可用的Flash */
size = flash_init ();
 ……
/* 初始化堆空間 */
mem_malloc_init (_armboot_start - CFG_MALLOC_LEN);
/* 重新定位環(huán)境變量, */
env_relocate ();
/* 從環(huán)境變量中獲取IP地址 */
gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
/* 以太網(wǎng)接口MAC 地址 */
……
devices_init (); /* 設(shè)備初始化 */
jumptable_init ();//跳轉(zhuǎn)表初始化
console_init_r (); /* 完整地初始化控制臺(tái)設(shè)備 */
enable_interrupts (); /* 使能中斷處理 */
/* 通過(guò)環(huán)境變量初始化 */
if ((s = getenv ("loadaddr")) != NULL)
load_addr = simple_strtoul (s, NULL, 16);
/* main_loop()循環(huán)不斷執(zhí)行 */
for (;;)
main_loop (); /* 主循環(huán)函數(shù)處理執(zhí)行用戶(hù)命令 -- common/main.c */
}
其中,初始化函數(shù)序列init_sequence[]
init_sequence[]數(shù)組保存著基本的初始化函數(shù)指針。這些函數(shù)名稱(chēng)和實(shí)現(xiàn)的程序文件在下列注釋中。
init_fnc_t *init_sequence[] = {
cpu_init, /* 基本的處理器相關(guān)配置 -- cpu/arm920t/cpu.c */
board_init, /* 基本的板級(jí)相關(guān)配置 -- board/smdk2410/smdk2410.c */
interrupt_init,/* 初始化例外處理 -- cpu/arm920t/s3c24x0/interrupt.c */
env_init, /* 初始化環(huán)境變量 -- common/env_flash.c */
init_baudrate, /* 初始化波特率設(shè)置 -- lib_arm/board.c */
serial_init, /* 串口通訊設(shè)置 -- cpu/arm920t/s3c24x0/serial.c */
console_init_f, /* 控制臺(tái)初始化階段1 -- common/console.c */
display_banner, /* 打印u-boot信息 -- lib_arm/board.c */
dram_init, /* 配置可用的RAM -- board/smdk2410/smdk2410.c */
display_dram_config,/* 顯示RAM的配置大小 -- lib_arm/board.c */
NULL,
};
整個(gè)u-boot的執(zhí)行就進(jìn)入等待用戶(hù)輸入命令,解析并執(zhí)行命令的死循環(huán)中。
二、修改main_loop()函數(shù)
我們期望此時(shí)能進(jìn)入一個(gè)菜單,通過(guò)輸入一些簡(jiǎn)單的指令來(lái)更新uboot、kernel、fs等。
1)、分析/common/main.c的main_loop函數(shù):系統(tǒng)進(jìn)入到main_loop
后首先判斷在3秒內(nèi)是否有輸入。如果有輸入就進(jìn)入命令行模式,我們可以在此命令行下通過(guò)輸入指令來(lái)更新系統(tǒng)。如果沒(méi)有輸入則執(zhí)行bootm 指令。
首先,我自己試過(guò)幾次,如果用run_command來(lái)保持環(huán)境變量“setenv bootcmd nand read 0xc0008000 0x100000 0x300000;bootm 0xc0008000 ”,系統(tǒng)會(huì)直接重啟。比較郁悶,想了變通的方法就是在/include/configs/smdk6410.h文件里直接修改CONFIG_BOOTCOMMAND 為nand read c0008000 100000 300000;bootm c0008000。據(jù)我分析系統(tǒng)啟動(dòng)后會(huì)從這個(gè)宏里讀取bootcmd參數(shù)。(如果有不對(duì)的,請(qǐng)高手指出) 那么我們后面就不用再設(shè)定這個(gè)參數(shù)了。


void main_loop (void)
{
…….
s = getenv ("bootcmd"); //獲取bootcmd指令
debug ("### main_loop: bootcmd="%s"n", s ? s : "");
if (bootdelay >= 0 && s && !abortboot (bootdelay)) {
// abortboot()主要是判斷bootdelay的時(shí)間內(nèi),是否有按鍵輸入。
……
run_command (s, 0); //如果沒(méi)有輸入就執(zhí)行bootcmd指令
}
//進(jìn)入一個(gè)命令行模式,循環(huán)接受用戶(hù)指令。
//我們就在這里加入一個(gè)我們自己的函數(shù)MainMenu()用來(lái)執(zhí)行菜單。
MainMenu();
/*
* Main Loop for Monitor Command Processing
*/
……
}
復(fù)制代碼
2)、在該文件的開(kāi)頭申明一個(gè)函數(shù)MainMenu():void MainMenu()
3)、定義我們的MainMenu()
void main_menu_usage(void)
{
printf("rn##### ok6410 Bootloader #####rn");
printf("[u] Download u-bootrn");
printf("[k] Download Linux kernelrn");
//printf("[y] Download YAFFS imagern");
printf("[c] Download cramfs imagern");
//printf("[d] Download to SDRAM & Runrn");
printf("[b] Boot the systemrn");
printf("[f] Format the Nand Flashrn");
printf("[s] Set the boot parametersrn");
printf("[r] Reboot u-bootrn");
printf("[q] Quit from menurn");
printf("Enter your selection: ");
}
void MainMenu()
{
char c;
char cmd_buf[256];
char name_buf[20];
char val_buf[256];
while (1)
{
main_menu_usage(); //輸出菜單的函數(shù)
c = getc(); //獲取輸入的字符
printf("%cn", c);
switch (c)
{
case ''u'': //燒寫(xiě)uboot
printf("nand erase nand and write uboot n");
strcpy(cmd_buf, "dnw c0008000 ; nand erase 0 100000 ; nand write 0xc0008000 0 100000");
printf("%s n",cmd_buf);
run_command(cmd_buf, 0);
break;
case ''k'': //燒寫(xiě)kernel
//先設(shè)定環(huán)境變量
strcpy(cmd_buf,"setenv bootargs "root=/dev/mtdblock2 console=ttySAC0,115200"“);
run_command(cmd_buf,0);
run_command("saveenv",0);
strcpy(cmd_buf, "dnw c0008000; nand erase 100000 300000 ; nand write.e 0xc0008000 100000 300000");
printf("%s n",cmd_buf);
run_command(cmd_buf, 0);
break;
case ''c'': //燒寫(xiě)cramfs文件系統(tǒng)
strcpy(cmd_buf, "dnw 0xc0008000; nand erase 400000 5000000 ; nand write.e 0xc0008000 400000 5000000");
printf("%s n",cmd_buf);
run_command(cmd_buf, 0);
strcpy(cmd_buf, "setenv bootargs "root=/dev/mtdblock2 rootfstype=cramfs console=ttySAC0,115200"");
printf("%s n",cmd_buf);
run_command(cmd_buf, 0);
strcpy(cmd_buf, "saveenv");
printf("%s n",cmd_buf);
run_command(cmd_buf, 0);
break;
case ''b'': //bootm 重啟
printf("Booting Linux ...n");
strcpy(cmd_buf, "nand read 0xc0008000 0x100000 0x300000;bootm 0xc0008000");
printf("%sn",cmd_buf);
run_command(cmd_buf, 0);
break;
case ''f'': //format flash
strcpy(cmd_buf, "nand scrub");
printf("%sn",cmd_buf);
run_command(cmd_buf, 0);
break;
case ''s'': //更改環(huán)境參數(shù)
param_menu_shell();這部分函數(shù)需要自己寫(xiě) :)
break;
case ''q'': //退出菜單
return;
break;
}
}
}
復(fù)制代碼
4)、加入?yún)?shù)修改的菜單函數(shù)
void param_menu_usage()
{
printf("rn##### Parameter Menu #####rn");
printf("[v] View the parametersrn");
printf("[s] Set parameter rn");
printf("[d] Delete parameter rn");
printf("[w] Write the parameters to flash memeory rn");
printf("[q] Quit rn");
printf("[l] load env 1 rn"); //設(shè)置參數(shù)1,跟新系統(tǒng)時(shí)用
printf("[m] load env 2 rn"); //設(shè)置參數(shù)2,更新完系統(tǒng)后恢復(fù)的參數(shù)
printf("Enter your selection: ");
}
void param_menu_shell(void)
{
char c;
char cmd_buf[256];
char name_buf[20];
char val_buf[256];
while (1)
{
param_menu_usage();
c = getc();
printf("%cn", c);
switch (c)
{
case ''v'':
strcpy(cmd_buf, "printenv ");
run_command(cmd_buf, 0);
break;

case ''s'':
sprintf(cmd_buf, "setenv ");
printf("Name: ");
readline(NULL);
strcat(cmd_buf, console_buffer);
run_command(cmd_buf, 0);
break;

case ''d'':
sprintf(cmd_buf, "setenv ");
printf("Name: ");
readline(NULL);
strcat(cmd_buf, console_buffer);
run_command(cmd_buf, 0);
break;
case ''w'':
sprintf(cmd_buf, "saveenv");
run_command(cmd_buf, 0);
break;

case ''l'':
sprintf(cmd_buf, "setenv bootargs "root=/dev/mtdblock2 console=ttySAC0,115200"");
printf("%sn",cmd_buf);
run_command(cmd_buf, 0);
//保存參數(shù)
run_command("saveenv", 0);
break;
case ''m'':
sprintf(cmd_buf, "setenv bootargs "root=/dev/mtdblock2 rootfstype=cramfs console=ttySAC0,115200"");
printf("%sn",cmd_buf);
run_command(cmd_buf, 0);
run_command("saveenv", 0);
break;
case ''q'':
return;
break;
}
}
}
復(fù)制代碼

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉