日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

real210移植记录-支持eMMC,增加菜单操作

發(fā)布時間:2024/9/3 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 real210移植记录-支持eMMC,增加菜单操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本次記錄的移植是使該u-boot支持eMMC,開發(fā)板為real210最新版的開發(fā)板,標(biāo)配eMMC 8GB flash,之前的移植都是在之前的210硬件上進行的核心板版本為v2,flash為nand 512MB。本次修改讓其支持eMMC,并且添加菜單操作。

首先考慮到emmc和SD卡操作協(xié)議兼容,那么之前做的u-boot是不是可以啟動呢,說做就做,使用配帶的u-boot把我自己的u-boot燒寫進開發(fā)板,嘿嘿,可以跑起來,我下載的u-boot已經(jīng)把環(huán)境變量的保存修改為了SD卡。結(jié)果環(huán)境變量也可以正常保存。開發(fā)板emmc接的是SD0通道。

說的是支持,其實基本什么也沒做,呵呵。

既然可以用,那么就相對容易多了。下面就是怎么使用自己制作的u-boot下載自己的u-boot,而且可以正常跑起來。想法是正確的,現(xiàn)實是殘酷的,~~~~(>_<)~~~~ 。

好不容易成功的把u-boot能夠燒寫進emmc了,可是無法啟動,并且提示check num error。雖然沒有啟動,但是提示的錯誤就很明顯了,校驗和校驗失敗。那么怎么會校驗失敗呢,原因就是在寫入的時候沒有進行校驗和計算。

所以就改進加入了校驗和的計算代碼,再次寫入,嘿嘿,OK了,可以正常跑起來了。

下面說說修改方法:

使用命令tftp 3ff00000 /u-boot/u-boot.bin把u-boot加載進內(nèi)存(這里建立在有u-boot能夠啟動的情況下,這里的u-boot是使用板子配帶的u-boot燒寫的)

燒寫B(tài)L1,命令是mmc write 3ff00000 1 10,注意這里的數(shù)字是16進制,那么這條命令的含義是什么呢,燒寫u-boot的前16個blocks的數(shù)據(jù),一個block大小為2k,實際上BL1只使用了8K,所以只要不少于8K的代碼,都是可以的,當(dāng)然了不能大于48了,因為第49 block開始存放的是BL2,也即完整的u-boot。

燒寫B(tài)L2,命令是mmc write 3ff00000 31 400,起始為第49 block(16進制為31),大小為1024 blocks(16進制為400)。

完成后重啟,悲劇了,error。原因是校驗和校驗失敗,因此需要在燒寫時對前8K進行校驗和計算再寫入才行。

那么問題就來了,命令行無法進行校驗和計算啊,所以需要用代碼實現(xiàn)了。

那好,就編寫代碼吧,另外我為了調(diào)試方便,順便增加了調(diào)試用的菜單選項。

主要函數(shù)如下

void tftp_burn(char *cmd) {if (!strcmp(cmd, "u-boot")){char *buf;ulong checksum = 0;int i = 0;ExecuteCmd("tftp 3ff00000 /u-boot/u-boot.bin");/*先拷貝u-boot.bin到內(nèi)存3ff00000處*/buf = 0x3ff00000 + 16;/*把u-boot首地址偏移16字節(jié)的內(nèi)存地址賦值給buf,此時u-boot的首地址是3ff00000*/for(i = 16;i < 8192;i++)/*循環(huán)進行u-boot的前8K代碼校驗和校驗,i賦值為16是因為u-boot的前16字節(jié)可不必要校驗和校驗*/{checksum += *buf;buf++; }*((volatile u32 *)(0x3ff00000 + 0x8)) = checksum;/*把計算出的校驗和寫入3ff00008地址處等待寫入EMMC*/printf("\nBL1 checksum is:%08x\n\n", checksum);/*printf("erase start block 1 (count 1073 blocks)...");ExecuteCmd("mmc erase 1 431");*/printf("writing BL1 start block 1 (count 16 blocks)...");ExecuteCmd("mmc write 3ff00000 1 10");/*燒寫B(tài)L1到eMMC的第一個block,長度為16 block(注意此時是10,但是為16進制)*/printf("\n");printf("writing u-boot.bin start block 49 (count 1024 blocks)...");ExecuteCmd("mmc write 3ff00000 31 400");/*燒寫u-boot到eMMC的第49個block,長度為1024 block(注意此時是400,但是為16進制)*/}else if(!strcmp(cmd, "debug")) {ExecuteCmd("tftp 3ff00000 /u-boot/u-boot.bin");printf("Run u-boot in 3ff00000\n");ExecuteCmd("go 3ff00000"); } } void realarm_tftp() {unsigned char select;while(1){printf("\n#**** Select the fuction ****#\n");/*由于system過大,所以tftp下不能下載文件系統(tǒng)*/printf("[1] Tftp burn u-boot\n");printf("[2] Tftp burn kernel\n");printf("[3] Tftp debug u-boot\n"); printf("[4] Exit\n");printf("Enter your Selection:");select = getc();printf("%c\n", select >= ' ' && select <= 127 ? select : ' '); switch(select) {case '1':tftp_burn("u-boot");break;case '2':tftp_burn("kernel");break;case '3':/*此選項功能需要屏蔽u-boot配置頭文件中的#define CONFIG_SKIP_LOWLEVEL_INIT,且CONFIG_SYS_TEXT_BASE需要修改為3ff00000*/tftp_burn("debug");/*u-boot 調(diào)試命令,tftp下載u-boot然后使用go命令運行之*/break;default:break;}} }


static void ExecuteCmd(char *cmd) {parse_string_outer(cmd, FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP); }
校驗和計算部分為:

ulong checksum = 0;int i = 0;ExecuteCmd("tftp 3ff00000 /u-boot/u-boot.bin");/*先拷貝u-boot.bin到內(nèi)存3ff00000處*/buf = 0x3ff00000 + 16;/*把u-boot首地址偏移16字節(jié)的內(nèi)存地址賦值給buf,此時u-boot的首地址是3ff00000*/for(i = 16;i < 8192;i++)/*循環(huán)進行u-boot的前8K代碼校驗和校驗,i賦值為16是因為u-boot的前16字節(jié)可不必要校驗和校驗*/{checksum += *buf;buf++; }*((volatile u32 *)(0x3ff00000 + 0x8)) = checksum;/*把計算出的校驗和寫入3ff00008地址處等待寫入EMMC*/printf("\nBL1 checksum is:%08x\n\n", checksum);
把realarm_tftp函數(shù)放入main_loop中,要放到延時之后。

完成后會有如下的界面


選擇1即可自動進行燒寫u-boot到emmc了,該方式是使用tftp實現(xiàn)u-boot到內(nèi)存中的,既可以實現(xiàn)下載,也可以很方便的調(diào)試修改的u-boot,很方便。

選項3的功能是tftp下載了u-boot之后直接跳轉(zhuǎn)到指定內(nèi)存地址運行,不燒寫到emmc中,這個是為了防止由于修改錯誤導(dǎo)致emmc啟動失敗而帶來的麻煩,是調(diào)試更加的有效率,O(∩_∩)O~!

本次記錄到此。




總結(jié)

以上是生活随笔為你收集整理的real210移植记录-支持eMMC,增加菜单操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。