Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写
生活随笔
收集整理的這篇文章主要介紹了
Davinci DM6446开发攻略-UBOOT-2009.03移植2 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=0x00080000;
KERNEL(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的信息,這點是值得肯定的,但是也有個別網站,把這些信息故意刪除掉,特別鄙視這種行為。
總結
以上是生活随笔為你收集整理的Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDFS(名称节点与数据节点)简介
- 下一篇: 【收藏】需求文档(PRD)终极撰写指南