u-boot-2012-07 for tiny210, 支持USB DNW, 支持YAFFS2烧写, 彻底抛弃superboot
買tiny210開發(fā)板之前, 真不知道連u-boot也不是提供。
superboot雖好,但只提供二進(jìn)制文件,且只能用SD卡燒寫,太不爽了。 從QQ2440,到Tiny6410, 再到Tiny210,??
感覺硬件越來越超值,可送的軟件卻越來越垃圾了。
痛定思痛,決定移植u-boot, 最早是在2011-12上面搞, 當(dāng)時把USB DNW做好了(借用6410 usbd-otg-hs.c/.h,??小改了幾處實(shí)現(xiàn)),能燒寫u-boot, kernel等二進(jìn)制文件,
燒寫yaffs2, 卻啟不來,... 因?yàn)轫?xiàng)目忙,所以就擱置了
最近看到u-boot 2012-07發(fā)布,決定直接在最新版本的u-boot上去把心愿了卻。
主要方法是: 對比superboot燒寫后的OOB數(shù)據(jù), IMG原始OOB數(shù)據(jù),以及u-boot燒寫后的OOB數(shù)據(jù)。
通過不斷對比發(fā)現(xiàn):??
1. 要用友善的mkyaffs2image-128M, 因?yàn)樗锩娌虐薊CC layout相關(guān)數(shù)據(jù)。
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;
}
這段代碼要屏蔽 (這段代碼在有些情況下會導(dǎo)致OOB沒有寫入)
3. nand_do_write_ops函數(shù)的
????if (likely(!oob))
????????memset(chip->oob_poi, 0xff, mtd->oobsize);
要把這個if判斷拿掉 (經(jīng)驗(yàn)證, 這個不是必須的)
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要關(guān)閉8bit hw ecc, 打開 CONFIG_NAND_4BIT_ECC。?這個很關(guān)鍵
在tiny210.h文件中
#define CONFIG_NAND_4BIT_ECC? 1
/*
#define CONFIG_NAND_BL1_8BIT_ECC
#define CONFIG_8BIT_HW_ECC_SLC????? 1
*/
?
6. 修改nand 驅(qū)動
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也要關(guān)閉8 bit hw ecc
差不多完成以上幾步后, 用u-boot燒寫rootfs_android.img就與superboot完全一致了。
android系統(tǒng)也就可以跑了。
總結(jié)
以上是生活随笔為你收集整理的u-boot-2012-07 for tiny210, 支持USB DNW, 支持YAFFS2烧写, 彻底抛弃superboot的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 多线程开发-线程的属性-分离
- 下一篇: python循环顶帖_设计Python数