|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
我來貼我寫的9200的eeprom的bootload代碼 |
| 作者:masashinakayama 欄目:ARM技術(shù) |
這是main.c 我寫的完整的bootload主要完成兩件事:1.配置寄存器,2.燒寫FLASH 雖然簡單了些,但是可以給大家參考一下,之前的1個匯編啟動文件和1個c初始化文件同ATMEL差不多,基本改了下SDRAM.html">SDRAM配置而已(我使用一片HY57V561620) 下面我改u-boot去嘍 #include "at91rm9200.h" #include "lib_at91rm9200.h" #define XMODEM_SOH 0x01 #define XMODEM_EOT 0x04 #define XMODEM_ACK 0x06 #define XMODEM_NAK 0x15 #define XMODEM_CAN 0x18 #define XMODEM_EOF 0x1A #define AT91C_BASE_NCS0 0x10000000 //NCS0全部16位訪問 #define AT91C_BASE_SDRAM 0x20000000 extern void AT91F_DBGU_Printk(CHAR *buffer); void DelayMS(unsigned SHORT time) //ms等級定時,time=1..1000 { unsigned SHORT piv; piv=32768*time/1000; AT91C_BASE_ST->ST_PIMR=piv; while (!(AT91C_BASE_ST->ST_SR&AT91C_ST_PITS)); } unsigned SHORT AT91F_CRC16(CHAR *ptr, int count) { int crc = 0; CHAR i; while (--count >= 0) { crc = crc ^ (int) *ptr++ << 8; i = 8; do { if (crc & 0x8000) crc = crc << 1 ^ 0x1021; else crc = crc << 1; } while(--i); } return (crc); } int AT91F_Flash_ReadID() { unsigned SHORT DeviceID; *(volatile unsigned SHORT *)(AT91C_BASE_NCS0+0x5555*2)=0xAA; *(volatile unsigned SHORT *)(AT91C_BASE_NCS0+0x2AAA*2)=0x55; *(volatile unsigned SHORT *)(AT91C_BASE_NCS0+0x5555*2)=0x90; DeviceID=*(volatile unsigned SHORT *)(AT91C_BASE_NCS0+0x1*2); *(volatile unsigned SHORT *)(AT91C_BASE_NCS0+0x0000*2)=0xF0; return (DeviceID); } void AT91F_Flash_ChipErase() { *(volatile unsigned SHORT *)(AT91C_BASE_NCS0+0x5555*2)=0xAA; *(volatile unsigned SHORT *)(AT91C_BASE_NCS0+0x2AAA*2)=0x55; *(volatile unsigned SHORT *)(AT91C_BASE_NCS0+0x5555*2)=0x80; *(volatile unsigned SHORT *)(AT91C_BASE_NCS0+0x5555*2)=0xAA; *(volatile unsigned SHORT *)(AT91C_BASE_NCS0+0x2AAA*2)=0x55; *(volatile unsigned SHORT *)(AT91C_BASE_NCS0+0x5555*2)=0x10; DelayMS(100); //wait >50 ms } void At91F_Flash_Write(unsigned int addr,unsigned SHORT data) { volatile SHORT TEMP; *(volatile unsigned SHORT *)(AT91C_BASE_NCS0+0x5555*2)=0xAA; *(volatile unsigned SHORT *)(AT91C_BASE_NCS0+0x2AAA*2)=0x55; *(volatile unsigned SHORT *)(AT91C_BASE_NCS0+0x5555*2)=0xA0; *(volatile unsigned SHORT *)(AT91C_BASE_NCS0+addr*2)=data; while (1) { TEMP=*(volatile unsigned SHORT *)(AT91C_BASE_NCS0+addr*2); TEMP^=*(volatile unsigned SHORT *)(AT91C_BASE_NCS0+addr*2); if (!(TEMP&0x40)) break; } } unsigned CHAR AT91F_DBGU_GetChar() //帶阻塞 { while (!AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU)); return (AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU)); } void AT91F_DBGU_PutChar(unsigned CHAR c) //帶阻塞 { while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_DBGU)); AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_DBGU,c); } volatile int a,b; int Main(void) { unsigned CHAR bIsFlashReady=0, bIsXmodemReady=0, bIsFileReady=0, bIsVerifyOK=1; volatile unsigned CHAR c; unsigned SHORT crc16; unsigned int i,block=0; AT91F_DBGU_Printk("\n\r\n\r"); AT91F_DBGU_Printk("******************************\n\r"); AT91F_DBGU_Printk("* ZT9200 EEPROM BIOS *\n\r"); AT91F_DBGU_Printk("* VER 1.0 *\n\r"); if (AT91F_Flash_ReadID()==0x234b) { AT91F_DBGU_Printk("* NCS0=SST39VF1601 *\n\r"); AT91F_DBGU_Printk("* Download by Xmodem *\n\r"); bIsFlashReady=1; } else { AT91F_DBGU_Printk("* NCS0=UNKNOWN *\n\r"); bIsFlashReady=0; } AT91F_DBGU_Printk("******************************\n\r"); if (!bIsFlashReady) while(1); // 下面開始執(zhí)行讀文件入SDRAM,協(xié)議為Xmodem while (!bIsXmodemReady) { AT91F_DBGU_PutChar('C'); AT91C_BASE_ST->ST_PIMR=0; //等待時間為兩秒 while (!(AT91C_BASE_ST->ST_SR&AT91C_ST_PITS)) if (AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU)) { &nb |
| 2樓: | >>參與討論 |
| 作者: roosvelt 于 2005/10/19 13:37:00 發(fā)布:
支持一下! |
|
| 3樓: | >>參與討論 |
| 作者: leifeng 于 2005/10/20 20:08:00 發(fā)布:
厲害! |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |