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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写

發布時間:2025/3/15 编程问答 84 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

很長一段時間沒有更新博客了,是因為要推出新開發方案和做好客戶服務工作,忙得不易樂乎。有關DAVINCI U-BOOT的移植,以前寫過一篇u-boot-1.3.4(2008年的),其實和這個u-boot-2009.03差別不大,只不過這個u-boot-2009.03是從TI的網站上下載的,是DAVINCI系列最新的u-boot,也適合DM6467和DM365/368,移植的方法承接《Davinci DM6446開發攻略——u-boot-1.3.4移植(1)》,而本篇著重介紹nand flash的燒寫。

Davinci產品需要燒寫UBL、U-BOOT、KERNEL、ROOTFS這四個最基本的文件。UBL的燒寫有兩種方式,一個就是TI開發包自帶的NandWriter.out文件,這必須使用560-plus仿真器(太貴了!)。另一個就是自己開發u-boot燒寫,或開發內核支持mtd block燒寫,我們一般移植u-boot進行燒寫。這個燒寫涉及到ECC校驗,移植比較復雜,為了保護自己一點點知識產權的東西,這里就保留不說,不過購買本工作室的開發板或核心板,都會提供燒寫UBL的工具,核心板我們直接就幫客戶燒寫好(沒辦法,辦公房租飛漲,物價飛漲,不,是翻翻倍漲,芯片炒作,TI兩款浮點工控芯片MCU F28XX的芯片從年初的120多元飛漲到600~800元!,而且沒貨!所以說日子越來越不好過)。而u-boot和kernel的燒寫,則比較簡單,jffs2燒寫稍微復雜一點。 關于u-boot-2009.03 nand flash的燒寫,命令分nand write 和 nand write.jffs2,這兩個命令是有差別的,nand write主要用來燒寫u-boot和kernel(uImage),和任何文件系統無關,一些剛剛接觸嵌入式LINUX的朋友需要了解這一點,而nand write.jffs2專門用來燒寫jffs2文件系統的,當然,你可以添加nand write.yaffs2,nand write.squahfs等等,這個在cmd_nand.c里的do_nand函數加自己的代碼,當然幾個基本的nand文件u-boot-2009.03/drivers/mtd/nand是需要看看和了解的,但不需要大改。DM6446 U-BOOT很多移植工作就是對davinci_dvevm.h的配置和定義,nand flash的燒寫也是在這里定義,我們以這個文件進行講解和分析,讓大家更了解U-BOOT,不單單是nand flash的燒寫。 #include/davinci_dvevm.h /*=======*/ /* Board */ /*=======*/ #define DV_EVM //#define CONFIG_SYS_NAND_SMALLPAGE???(這個是支持512字節NAND FLASH定義) #define CONFIG_SYS_NAND_LARGEPAGE?(本工作室的開發板核心板是2K—PAGE,目前比較新的NAND,因為有些客戶需要移植yaffs2,512字節的只能支持yaffs,超級慢) #undef??? CONFIG_SYS_USE_NOR(現在基本上取消NOR FLASH的支持,價格貴,容量小) #define??? CONFIG_SYS_USE_NAND(定義板子使用NAND FLASH) /*===================*/ /* SoC Configuration */ /*===================*/ #define CONFIG_ARM926EJS????????????????? /* arm926ejs CPU core */ #define CONFIG_SYS_CLK_FREQ??? 297000000???? /* Arm Clock frequency */ #define CONFIG_SYS_TIMERBASE???????? 0x01c21400??? /* use timer 0 */ #define CONFIG_SYS_HZ_CLOCK?????????? 27000000?????? /* Timer Input clock freq */ #define CONFIG_SYS_HZ???????????????? 1000 #define CONFIG_SOC_DM644X //#define CONFIG_DISPLAY_CPUINFO?(顯示CPU的頻率信息等,屏蔽不用,以后的版本都有這個) /*====================================================*/ /* EEPROM definitions for Atmel 24C256BN SEEPROM chip */ /* on Sonata/DV_EVM board. No EEPROM on schmoogie.??? */ /*====================================================*/ (這個是TI?自己的EVM,帶有1個EEPROM,保存MAC地址,我們板子不用,所以屏蔽) //#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN???????????? 2 //#define CONFIG_SYS_I2C_EEPROM_ADDR??????? 0x50 //#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS?6 //#define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS??? 20 /*=============*/ /* Memory Info */ /*=============*/ (DDR內存的一些定義) #define CONFIG_SYS_MALLOC_LEN???????????? (0x10000 + 128*1024)?/* malloc() len */ #define CONFIG_SYS_GBL_DATA_SIZE?128???????? /* reserved for initial data */ #define CONFIG_SYS_MEMTEST_START?????? 0x80000000??? /* memtest start address */ #define CONFIG_SYS_MEMTEST_END????????? 0x81000000??? /* 16MB RAM test */ #define CONFIG_NR_DRAM_BANKS?????? 1??????????? /* we have 1 bank of DRAM */ #define CONFIG_STACKSIZE??? (256*1024)???? /* regular stack */ #define PHYS_SDRAM_1?????????? 0x80000000??? /* DDR Start */ #define PHYS_SDRAM_1_SIZE?0x10000000??? /* DDR size 256MB */ #define DDR_8BANKS????????????????????? /* 8-bank DDR2 (256MB) */ (我們的核心板使用DDR256M-byte,所以是8 bank) /*====================*/ /* Serial Driver info */ /*====================*/ (串口配置信息,UART0=ttyS0,一般用來打印LINUX調試信息) #define CONFIG_SYS_NS16550 #define CONFIG_SYS_NS16550_SERIAL #define CONFIG_SYS_NS16550_REG_SIZE??? -4??? /* NS16550 register size, byteorder */ #define CONFIG_SYS_NS16550_COM1??? 0x01c20000??? /* Base address of UART0 */ #define CONFIG_SYS_NS16550_CLK????????????? 27000000?????? /* Input clock to NS16550 */ #define CONFIG_CONS_INDEX?1??????????? /* use UART0 for console */ #define CONFIG_BAUDRATE??????????? 115200?????????? /* Default baud rate */ #define CONFIG_SYS_BAUDRATE_TABLE???? { 9600, 19200, 38400, 57600, 115200 } /*===================*/ /* I2C Configuration */ /*===================*/ (如果你不需要在U-BOOT對I2C芯片讀寫操作,可以屏蔽這個) //#define CONFIG_HARD_I2C //#define CONFIG_DRIVER_DAVINCI_I2C //#define CONFIG_SYS_I2C_SPEED???????? 80000???? /* 100Kbps won't work, silicon bug */ //#define CONFIG_SYS_I2C_SLAVE???????? 10??? /* Bogus, master-only in U-Boot */ /*==================================*/ /* Network & Ethernet Configuration */ /*==================================*/ #define CONFIG_DRIVER_TI_EMAC #define CONFIG_MII #define CONFIG_BOOTP_DEFAULT #define CONFIG_BOOTP_DNS #define CONFIG_BOOTP_DNS2 #define CONFIG_BOOTP_SEND_HOSTNAME #define CONFIG_NET_RETRY_COUNT??? 10 #define CONFIG_IPADDR?????? 192.168.1.188????(板子U-BOOT的IP) #define CONFIG_SERVERIP???? 192.168.1.252???(HOST?你的linux開發主機IP,一般是NFS的IP) /*=====================*/ /* Flash & Environment */ /*=====================*/ #ifdef CONFIG_SYS_USE_NAND #define CONFIG_NAND_DAVINCI #undef CONFIG_ENV_IS_IN_FLASH #define CONFIG_SYS_NO_FLASH #define CONFIG_ENV_IS_IN_NAND????????????? /* U-Boot env in NAND Flash?*/ #ifdef CONFIG_SYS_NAND_SMALLPAGE #define CONFIG_ENV_SECT_SIZE?? 512?/* Env sector Size */ #define CONFIG_ENV_SIZE???????????? SZ_16K #else #define CONFIG_ENV_SECT_SIZE?? 2048?????? /* Env sector Size */ #define CONFIG_ENV_SIZE???????????? SZ_128K #endif #define CONFIG_SKIP_LOWLEVEL_INIT?????? /* U-Boot is loaded by a bootloader */ #define CONFIG_SKIP_RELOCATE_UBOOT?? /* to a proper address, init done */ #define CONFIG_SYS_NAND_BASE??????? 0x02000000(這個是EMIF CS2的起始地址,類似片選的說法) #define CONFIG_SYS_NAND_HW_ECC?(TI默認?硬件 ECC) #define CONFIG_SYS_MAX_NAND_DEVICE?1???? /* Max number of NAND devices */ (上面的定義表示板子只有1片NAND FLASH) #define??? CONFIG_MASK_CLE??????????????? 0x10 #define??? CONFIG_MASK_ALE??????????????? 0x08 #define CONFIG_ENV_OFFSET??????? 0xE0000 /* Block 7--not used by bootcode */ (上面的定義就是存放u-boot參數的地址,源碼是0x0,但我們一般把參數放到U-BOOT存儲地址前后) #define DEF_BOOTM????????? "" #elif defined(CONFIG_SYS_USE_NOR)?(這個是支持NOR FLASH的定義,不用理會) #ifdef CONFIG_NOR_UART_BOOT #define CONFIG_SKIP_LOWLEVEL_INIT?????? /* U-Boot is loaded by a bootloader */ #define CONFIG_SKIP_RELOCATE_UBOOT?? /* to a proper address, init done */ #else #undef CONFIG_SKIP_LOWLEVEL_INIT #undef CONFIG_SKIP_RELOCATE_UBOOT #endif #define CONFIG_ENV_IS_IN_FLASH #undef CONFIG_SYS_NO_FLASH #define CONFIG_FLASH_CFI_DRIVER #define CONFIG_SYS_FLASH_CFI #define CONFIG_SYS_MAX_FLASH_BANKS?1??????????? /* max number of flash banks */ #define CONFIG_SYS_FLASH_SECT_SZ?0x20000???????? /* 128KB sect size Intel Flash */ #define CONFIG_ENV_OFFSET??????? (CONFIG_SYS_FLASH_SECT_SZ*3) #define PHYS_FLASH_1??????????? 0x02000000??? /* CS2 Base address?????? */ #define CONFIG_SYS_FLASH_BASE????????????? PHYS_FLASH_1?? /* Flash Base for U-Boot */ #define PHYS_FLASH_SIZE????????????? 0x1000000???? /* Flash size 16MB */ #define CONFIG_SYS_MAX_FLASH_SECT???? 512 #define CONFIG_ENV_SECT_SIZE?? CONFIG_SYS_FLASH_SECT_SZ????? /* Env sector Size */ #define CONFIG_SYS_FLASH_PROTECTION #endif /*==============================*/ /* U-Boot general configuration */ /*==============================*/ #undef??? CONFIG_USE_IRQ??????????????????? /* No IRQ/FIQ in U-Boot */ #define CONFIG_MISC_INIT_R #define CONFIG_BOOTDELAY?2???(這個DELAY一般定義1~2,3秒太長,為了縮短BOOT的時間,有些產品直接不定義,或0) #define CONFIG_BOOTFILE???????????? "uImage" /* Boot file name */ (這uImage其實是linux內核的鏡像文件,也就是uImage=zImage +?被U-BOOT識別的header,或者是mkimage處理過的Image文件) #define CONFIG_SYS_PROMPT??????? "U-Boot > "??? /* Monitor Command Prompt */ #define CONFIG_SYS_CBSIZE????????? 1024????????????? /* Console I/O Buffer Size?*/ #define CONFIG_SYS_PBSIZE????????? (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16)????? /* Print buffer sz */ #define CONFIG_SYS_MAXARGS?????????? 16?????????? /* max number of command args */ #define CONFIG_SYS_BARGSIZE??????????? CONFIG_SYS_CBSIZE?????? /* Boot Argument Buffer Size */ #define CONFIG_SYS_LOAD_ADDR??????? 0x82000000??? /* 0x80700000 default Linux kernel load address */ (這個是TFTP或RS232下載各個鏡像文件緩存的地址,默認是0x80700000,但是由于自己制作的ROOTFS文件很大,有些往外超過32M,而U-BOOT本身運行的起始地址是“TEXT_BASE = 0x81080000”,所以我們把下載文件緩存的地址改為0x82000000) #define CONFIG_VERSION_VARIABLE #define CONFIG_AUTO_COMPLETE????????????? /* Won't work with hush so far, may be later */ #define CONFIG_SYS_HUSH_PARSER #define CONFIG_SYS_PROMPT_HUSH_PS2?? "> " #define CONFIG_CMDLINE_EDITING #define CONFIG_SYS_LONGHELP #define CONFIG_CRC32_VERIFY #define CONFIG_MX_CYCLIC #define CONFIG_MUSB_HCD?(DAVINCI平臺在U-BOOT支持USB HUB) #define CONFIG_USB_DAVINCI /*===================*/ /* Linux Information */ /*===================*/ #define LINUX_BOOT_PARAM_ADDR???? 0x80000100 #define CONFIG_CMDLINE_TAG #define CONFIG_SETUP_MEMORY_TAGS #define CONFIG_BOOTARGS??????????? "mem=118M console=ttyS0,115200n8 ip=192.168.1.188 noinitrd root=/dev/nfs rw nfsroot=192.168.1.252:/home/davinci/nfs/tirootfs,nolock" //#define CONFIG_BOOTARGS????????? "mem=118M console=ttyS0,115200n8 root=/dev/mtdblock2 rw rootfstype=jffs2 noinitrd ip=off" (上面的定義就是bootargs的參數了,一個是NFS,另一個是產品級的參數) #define CONFIG_ETHADDR?????? 00:03:55:88:00:00(UBOOT一般不在公網上運行,所以可以隨便定義一個MAC地址) #define CONFIG_BOOTCOMMAND?"run nand_boot"(這是NAND BOOT的命令定義,見后半部分介紹) /*=================*/ /* U-Boot commands */ /*=================*/ (隨著時間的推移,U-BOOT越來越完善,功能越來越強大,同時生產的BIN文件也越大,有些公司產品成本控制很嚴格,往往使用容量小的FLASH,這時就需要對任何的鏡像文件進行“瘦身”,只有保證U-BOOT基本功能,其他功能統統屏蔽掉,這樣編譯出來的BIN就小多了) #include <config_cmd_default.h> #define CONFIG_CMD_ASKENV #undef CONFIG_CMD_BOOTD #undef CONFIG_CMD_DHCP #undef CONFIG_CMD_DIAG #undef CONFIG_CMD_I2C #define CONFIG_CMD_MII #define CONFIG_CMD_PING #define CONFIG_CMD_SAVES #undef CONFIG_CMD_EEPROM #undef CONFIG_CMD_BDI #undef CONFIG_CMD_FPGA #undef CONFIG_CMD_NFS #undef CONFIG_CMD_SETGETDCR #ifdef CONFIG_SYS_USE_NAND #undef CONFIG_CMD_FLASH #undef CONFIG_CMD_IMLS #define CONFIG_CMD_NAND #define CONFIG_JFFS2_NAND(為了支持JFFS2在NAND的燒寫,必須定義這個) #elif defined(CONFIG_SYS_USE_NOR) #define CONFIG_CMD_JFFS2 #else #error "Either CONFIG_SYS_USE_NAND or CONFIG_SYS_USE_NOR _MUST_ be defined !!!" #endif /*==========================*/ /* USB MSC support (if any) */ /*==========================*/ #ifdef CONFIG_USB_DAVINCI #define CONFIG_CMD_USB #ifdef CONFIG_MUSB_HCD #define CONFIG_USB_STORAGE #define CONFIG_CMD_STORAGE #define CONFIG_CMD_FAT #define CONFIG_DOS_PARTITION #endif #ifdef CONFIG_USB_KEYBOARD #define CONFIG_SYS_USB_EVENT_POLL #define CONFIG_PREBOOT "usb start" #endif #endif #undef CONFIG_CMD_LOADB?/* loadb */(“瘦身”) #undef CONFIG_CMD_LOADS?? /* loads */ #undef CONFIG_CMD_ITEST #undef CONFIG_CMD_XIMG #undef CONFIG_CMD_KGDB #undef CONFIG_CMD_SOURCE?????? /* "source" command support?????? */ /*=======================*/ /* KGDB support (if any) */ /*=======================*/ #ifdef CONFIG_CMD_KGDB #define CONFIG_KGDB_BAUDRATE?????? 115200??? /* speed to run kgdb serial port */ #define CONFIG_KGDB_SER_INDEX????? 1???? /* which serial port to use */ #endif #define CONFIG_EXTRA_ENV_SETTINGS???? \ "clearenv=nand erase 0xe0000 0x20000;\0"?\ "cleardata=nand erase 0x7000000 0x1000000\0" \ "updateuboot=tftp 0x82000000 davinci_uboot.bin;nand erase 0x100000 0x80000\0" \ "updatecore=tftp 0x82000000 davinci_kernel.bin;nand erase 0x180000 0x480000\0" \ "updaterootfs=tftp 0x82000000 davinci_rootfs.bin;nand erase 0x600000 0x6A00000\0" \ "nand_boot=nboot 0x80008000 0 0x180000;bootm 0x80008000\0" \ "tftp_boot=tftpboot 0x80008000 davinci_kernel.bin;bootm 0x80008000\0" 因為是2k-page的NAND, 分區情況: 根據TI?文檔說明,對于LARGE PAGE的NAND,UBL只能存放在0x20000~0x40000區間; U-BOOT: addr=0x00100000, size=0x00080000KERNEL(CORE): addr=0x00180000,size=0x00480000; ROOTFS(mtdblock2): addr=0x00600000,size=0x06A00000; DATA(mtdblock3): addr=0x07000000,size=0x01000000; 注意TFTP要先下載,再擦除,否則網口不行就先擦除FLASH,悲劇是一直上演。 #endif /* __CONFIG_H */ 根據CONFIG_EXTRA_ENV_SETTINGS的定義,我們可以使用以下命令燒寫操作 U-Boot > run updateuboot(U-BOOT支持run命令) TFTP from server 192.168.1.252; our IP address is 192.168.1.188 Filename 'davinci_uboot.bin'. Load address: 0x82000000 Loading: ############ done Bytes transferred = 167920 (28ff0 hex) NAND erase: device 0 offset 0x100000, size 0x80000 Erasing at 0x160000 -- 100% complete. OK U-Boot > nand write 82000000 100000 2A000???(實際長度是0x28ff0,但我們使用0x2A000,128K-byte的倍數) 提示:U-BOOT > 燒寫命令能識別82000000?100000這些16進制。 U-BOOT編譯時生成的u-boot.bin是不能被UBL給BOOT起來的,因為u-boot.bin沒帶有文件頭header,而u-boot.img是可以被UBL給BOOT起來,這一點要注意。而我們的davinci_uboot.bin是經過U-BOOT自帶的mkimage處理的。 U-Boot > run updatecore下載davinci_rootfs.bin(uImage); 上面的命令只是下載和erase flash分區,并沒有燒寫,請參考nand write 82000000 180000 size的格式。 U-Boot > run updaterootfs下載davinci_rootfs.bin;怎樣產生rootfs鏡像文件見《TI Davinci DM6446開發攻略——根文件系統的裁剪nand write.Jffs2 82000000 600000 size nand_boot=nboot 0x80008000 0x0 0x180000;bootm 0x80008000 表示從NAND 0x180000的地方COPY內核到DDR內存0x80008000的地址,0x0表示nand_info[0]的下標0,因為我們系統只支持1片nand CONFIG_SYS_MAX_NAND_DEVICE

JFFS2的燒寫,移植時,需要注意ECC的問題,同時內核移植里也有統一對應,否則內核無法加載JFFS2,這里就保留不多說,本人已經指明了道路,燒寫命令也說明了,需要有興趣的朋友去試試,不試怎么能提高自己呢?


聲明一下,很多朋友轉載本人的文章,絕大多數人都保留本人51CTO的信息,這點是值得肯定的,但是也有個別網站,把這些信息故意刪除掉,特別鄙視這種行為。

本文出自 “集成系統-踏上文明的征程” 博客,請務必保留此出處http://zjbintsystem.blog.51cto.com/964211/392000


總結

以上是生活随笔為你收集整理的Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写的全部內容,希望文章能夠幫你解決所遇到的問題。

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