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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

u-boot-2012-07 for tiny210, 支持USB DNW, 支持YAFFS2烧写, 彻底抛弃superboot

發(fā)布時間:2023/12/10 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 u-boot-2012-07 for tiny210, 支持USB DNW, 支持YAFFS2烧写, 彻底抛弃superboot 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

買tiny210開發(fā)板之前, 真不知道連u-boot也不是提供。
superboot雖好,但只提供二進制文件,且只能用SD卡燒寫,太不爽了。 從QQ2440,到Tiny6410, 再到Tiny210,??
感覺硬件越來越超值,可送的軟件卻越來越垃圾了。

痛定思痛,決定移植u-boot, 最早是在2011-12上面搞, 當時把USB DNW做好了(借用6410 usbd-otg-hs.c/.h,??小改了幾處實現),能燒寫u-boot, kernel等二進制文件,
燒寫yaffs2, 卻啟不來,... 因為項目忙,所以就擱置了

最近看到u-boot 2012-07發(fā)布,決定直接在最新版本的u-boot上去把心愿了卻。
主要方法是: 對比superboot燒寫后的OOB數據, IMG原始OOB數據,以及u-boot燒寫后的OOB數據。

通過不斷對比發(fā)現:??
1. 要用友善的mkyaffs2image-128M, 因為它里面才包含了ECC layout相關數據。
2. nand_write_skip_bad的
if (!need_skip && !(flags & WITH_DROP_FFS)) {
????????rval = nand_write (nand, offset, length, buffer);
????????if (rval == 0)
????????????return 0;

????????*length = 0;
????????printf ("NAND write to offset %llx failed %d\n",
????????????offset, rval);
????????return rval;
}
這段代碼要屏蔽 (這段代碼在有些情況下會導致OOB沒有寫入
3. nand_do_write_ops函數的

????if (likely(!oob))
????????memset(chip->oob_poi, 0xff, mtd->oobsize);
要把這個if判斷拿掉 (經驗證, 這個不是必須的
4.??OOB mode要改為MTD_OOB_PLACE。代碼如下:

int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
???u_char *buffer, int flags)

{

......

#ifdef CONFIG_CMD_NAND_YAFFS
??if (flags & WITH_YAFFS_OOB) {
???int page, pages;
???size_t pagesize = nand->writesize;
???size_t pagesize_oob = pagesize + nand->oobsize;
???struct mtd_oob_ops ops;

???ops.len = pagesize;
???ops.ooblen = nand->oobsize;
???ops.mode = MTD_OOB_PLACE; //MTD_OOB_AUTO;
???ops.ooboffs = 0;

?........


5. u-boot要關閉8bit hw ecc, 打開 CONFIG_NAND_4BIT_ECC。?這個很關鍵

在tiny210.h文件中

#define CONFIG_NAND_4BIT_ECC? 1

/*
#define CONFIG_NAND_BL1_8BIT_ECC
#define CONFIG_8BIT_HW_ECC_SLC????? 1

*/

?

6. 修改nand 驅動

int board_nand_init(struct nand_chip *nand)

{

.....

if (!type->pagesize) {
??if (((nand->cellinfo >> 2) & 0x3) == 0) {
???nand_type = S3C_NAND_TYPE_SLC;
???nand->ecc.size = 512;
???nand->ecc.bytes?= 4;

.......

???if ((1024 << (tmp & 0x3)) > 512) {
#if !defined(CONFIG_NAND_BL1_8BIT_ECC)? ?
???
?nand->ecc.read_page = s3c_nand_read_page_1bit;
????nand->ecc.write_page = s3c_nand_write_page_1bit;
????nand->ecc.read_oob = s3c_nand_read_oob_1bit;
????nand->ecc.write_oob = s3c_nand_write_oob_1bit;
????nand->ecc.layout = &s3c_nand_oob_64;
????nand->ecc.hwctl = s3c_nand_enable_hwecc;
??????????????? nand->ecc.calculate = s3c_nand_calculate_ecc;
??????????????? nand->ecc.correct = s3c_nand_correct_data;
??????????????? nand->options |= NAND_NO_SUBPAGE_WRITE;
#else
????nand->ecc.read_page = s3c_nand_read_page_8bit;
????nand->ecc.write_page = s3c_nand_write_page_8bit;
????nand->ecc.read_oob = s3c_nand_read_oob_8bit;
????nand->ecc.write_oob = s3c_nand_write_oob_8bit;
????nand->ecc.layout = &s3c_nand_oob_64_8bit;
????nand->ecc.hwctl = s3c_nand_enable_hwecc_8bit;
????nand->ecc.calculate = s3c_nand_calculate_ecc_8bit;
????nand->ecc.correct = s3c_nand_correct_data_8bit;
????nand->ecc.size = 512;
????nand->ecc.bytes = 13;
????nand->options |= NAND_NO_SUBPAGE_WRITE;
#endif

....


7. kernel也要關閉8 bit hw ecc

差不多完成以上幾步后, 用u-boot燒寫rootfs_android.img就與superboot完全一致了。
android系統也就可以跑了。

總結

以上是生活随笔為你收集整理的u-boot-2012-07 for tiny210, 支持USB DNW, 支持YAFFS2烧写, 彻底抛弃superboot的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。