FBurnCmd.c
上传用户:dahaojd
上传日期:2008-01-29
资源大小:14357k
文件大小:10k
源码类别:

DSP编程

开发平台:

C/C++

  1. /*********************************************************************
  2.  *          (C) COPYRIGHT TEXAS INSTRUMENTS, INC. 2000-2002
  3.  * FlashBurn Programming Functions
  4.  *     for DM642 EVM
  5.  */
  6. /*
  7.  */
  8. #include <stdio.h>
  9. #include "type.h"
  10. #include "c642evm.h"
  11. #include "FBTC642.h"
  12. #include "FBCmd.h"
  13. /* Local prototype
  14.  */
  15. static GetFlashBuf(u8 *dest, u8 *flashsrc, u16 nBytes);
  16. /* Used by the checksum calc functions
  17.  */
  18. static volatile unsigned long cksum = 0;
  19.     /* flashstart/next are used to track
  20.      * where we are in a "flat" Flash memory.
  21.      * Paging, etc. are handled by helper
  22.      * funcs.
  23.      */  
  24. static volatile u8 *flashstart = (volatile u8 *)FLASH_START;
  25. static volatile u8 *flashnext  = (volatile u8 *)FLASH_START;
  26. /* These are "override" values, in case the
  27.  * Host has sent new flash base addr and size.
  28.      * flashbaseov is 0xffffffff normally, but changes
  29.      * if Host sends the Change FLASHSTART Address command.
  30.      * Thus if it's not 0xffffffff, then it should be used
  31.      * instead of the FLASH_START value. 
  32.  */
  33. static volatile u8 *flashbaseov = (u8 *)0xffffffffUL;
  34. static unsigned long flashsizeov =  0xffffffffUL;
  35. /* Constant table containing end address of each sector */
  36. unsigned long sector_end[FLASH_SECTORS] = {  /*change*/
  37.     FLASH_START + 0x00ffff, /* Sector 0  */
  38.     FLASH_START + 0x01ffff, /* Sector 1  */
  39.     FLASH_START + 0x02ffff, /* Sector 2  */
  40.     FLASH_START + 0x03ffff, /* Sector 3  */
  41.     FLASH_START + 0x04ffff, /* Sector 4  */
  42.     FLASH_START + 0x05ffff, /* Sector 5  */
  43.     FLASH_START + 0x06ffff, /* Sector 6  */
  44.     FLASH_START + 0x07ffff, /* Sector 7  */    
  45.     FLASH_START + 0x08ffff, /* Sector 8  */
  46.     FLASH_START + 0x09ffff, /* Sector 9  */
  47.     FLASH_START + 0x0affff, /* Sector 10 */
  48.     FLASH_START + 0x0bffff, /* Sector 11 */
  49.     FLASH_START + 0x0cffff, /* Sector 12 */
  50.     FLASH_START + 0x0dffff, /* Sector 13 */
  51.     FLASH_START + 0x0effff, /* Sector 14 */
  52.     FLASH_START + 0x0fffff, /* Sector 15 */
  53.     FLASH_START + 0x10ffff, /* Sector 16 */
  54.     FLASH_START + 0x11ffff, /* Sector 17 */
  55.     FLASH_START + 0x12ffff, /* Sector 18 */
  56.     FLASH_START + 0x13ffff, /* Sector 19 */
  57.     FLASH_START + 0x14ffff, /* Sector 20 */
  58.     FLASH_START + 0x15ffff, /* Sector 21 */
  59.     FLASH_START + 0x16ffff, /* Sector 22 */
  60.     FLASH_START + 0x17ffff, /* Sector 23 */
  61.     FLASH_START + 0x18ffff, /* Sector 24 */
  62.     FLASH_START + 0x19ffff, /* Sector 25 */
  63.     FLASH_START + 0x1affff, /* Sector 26 */
  64.     FLASH_START + 0x1bffff, /* Sector 27 */
  65.     FLASH_START + 0x1cffff, /* Sector 28 */
  66.     FLASH_START + 0x1dffff, /* Sector 29 */
  67.     FLASH_START + 0x1effff, /* Sector 30 */
  68.     FLASH_START + 0x1fffff, /* Sector 31 */
  69.     FLASH_START + 0x20ffff, /* Sector 32 */
  70.     FLASH_START + 0x21ffff, /* Sector 33 */
  71.     FLASH_START + 0x22ffff, /* Sector 34 */
  72.     FLASH_START + 0x23ffff, /* Sector 35 */
  73.     FLASH_START + 0x24ffff, /* Sector 36 */
  74.     FLASH_START + 0x25ffff, /* Sector 37 */
  75.     FLASH_START + 0x26ffff, /* Sector 38 */
  76.     FLASH_START + 0x27ffff, /* Sector 39 */    
  77.     FLASH_START + 0x28ffff, /* Sector 40 */
  78.     FLASH_START + 0x29ffff, /* Sector 41 */
  79.     FLASH_START + 0x2affff, /* Sector 42 */
  80.     FLASH_START + 0x2bffff, /* Sector 43 */
  81.     FLASH_START + 0x2cffff, /* Sector 44 */
  82.     FLASH_START + 0x2dffff, /* Sector 45 */
  83.     FLASH_START + 0x2effff, /* Sector 46 */
  84.     FLASH_START + 0x2fffff, /* Sector 47 */
  85.     FLASH_START + 0x30ffff, /* Sector 48 */
  86.     FLASH_START + 0x31ffff, /* Sector 49 */
  87.     FLASH_START + 0x32ffff, /* Sector 50 */
  88.     FLASH_START + 0x33ffff, /* Sector 51 */
  89.     FLASH_START + 0x34ffff, /* Sector 52 */
  90.     FLASH_START + 0x35ffff, /* Sector 53 */
  91.     FLASH_START + 0x36ffff, /* Sector 54 */
  92.     FLASH_START + 0x37ffff, /* Sector 55 */
  93.     FLASH_START + 0x38ffff, /* Sector 56 */
  94.     FLASH_START + 0x39ffff, /* Sector 57 */
  95.     FLASH_START + 0x3affff, /* Sector 58 */
  96.     FLASH_START + 0x3bffff, /* Sector 59 */
  97.     FLASH_START + 0x3cffff, /* Sector 60 */
  98.     FLASH_START + 0x3dffff, /* Sector 61 */
  99.     FLASH_START + 0x3effff, /* Sector 62 */
  100.     FLASH_START + 0x3fffff, /* Sector 63 */
  101.    // FLASH_START + 0x39ffff, /* Sector 64 */
  102.    // FLASH_START + 0x3affff, /* Sector 65 */
  103.    // FLASH_START + 0x3bffff, /* Sector 66 */
  104.    // FLASH_START + 0x3cffff, /* Sector 67 */
  105.    // FLASH_START + 0x3dffff, /* Sector 68 */
  106.    // FLASH_START + 0x3effff, /* Sector 69 */
  107.    // FLASH_START + 0x3fffff, /* Sector 70 */
  108. };
  109. char erasetable[FLASH_SECTORS];
  110. /* Set and get the flash base address
  111.  */
  112. void SetFlashBase(unsigned long val)
  113. {
  114. flashbaseov = (volatile u8 *)val;
  115. }
  116. volatile u8 *GetFlashBase(void)
  117. {
  118. return flashbaseov != (volatile u8 *)0xffffffffL ?
  119.                       flashbaseov :
  120.                       (volatile u8 *)FLASH_START;
  121. }
  122. /* Set and get the flash size
  123.  */
  124. void SetFlashSize(unsigned long val)
  125. {
  126. flashsizeov = val;
  127. }
  128. unsigned long GetFlashSize(void)
  129. {
  130. return flashsizeov != 0xffffffffL ? flashsizeov : FLASH_SIZE;
  131. }
  132. void InitFlash(void)
  133. {
  134.     int i;
  135. flashstart = GetFlashBase();
  136. flashnext = flashstart;
  137.     
  138.     /* Mark all sectors as unerased */
  139.     for (i = 0; i < FLASH_SECTORS; i++)
  140.         erasetable[i] = 0;
  141. }
  142. void SetFlashAddr(u8 *addr)
  143. {
  144. flashstart = (volatile u8 *)addr;
  145. flashnext = flashstart;
  146. }
  147. volatile u8 *GetNextFlashAddr(void)
  148. {
  149. return flashnext;
  150. }
  151. /* Erase a segment of Flash memory */
  152. void flash_erase(u32 start, u32 length)
  153. {
  154.     int i;
  155.     unsigned long sector_base, phys_base, end;
  156.     
  157.     /* Calculate extents of range to erase */
  158.     end = start + length - 1;
  159.     
  160.     /* Walk through each sector, erase any sectors within range */
  161.     sector_base = FLASH_START;
  162.     for (i = 0; i < FLASH_SECTORS; i++)
  163.     {
  164.         if (!erasetable[i] && (start <= sector_end[i]) && (end >= sector_base))
  165.         {
  166.             /* Start sector erase sequence */
  167.             phys_base = (sector_base & 0x00070000) + FLASH_START;
  168.             *FLASH_PAGE = (sector_base & 0x380000) >> 19;
  169.             *(volatile char *)(FLASH_START+0xaaa) = (char)FLASH_KEY1; /*change*/
  170.             *(volatile char *)(FLASH_START+0x555) = (char)FLASH_KEY2;
  171.             *(volatile char *)(FLASH_START+0xaaa) = (char)FLASH_KEY4;
  172.             *(volatile char *)(FLASH_START+0xaaa) = (char)FLASH_KEY1;
  173.             *(volatile char *)(FLASH_START+0x555) = (char)FLASH_KEY2;
  174.             *(volatile char *)(phys_base)         = (char)FLASH_KEY6;
  175.             
  176.             /* Wait until erase is done */
  177.         while(GetFlashVal(sector_base) != 0xff);
  178.             /* Put the Flash in normal mode */
  179.             *(volatile char *)phys_base = (char)0xf0;
  180.             
  181.             /* Mark sector as erased */
  182.             erasetable[i] = 1;               
  183.         }
  184.         
  185.         /* Advance to next sector */
  186.         sector_base = sector_end[i] + 1;
  187.     }
  188. }
  189. /* Burns flash data, starting at flashnext.
  190.  * This embodies the burning algorithm for the
  191.  * AMD29LV033C flash memory used on DM642 EVM
  192.  */
  193. void BurnFlash(u8 *data, u16 nBytes)
  194. {
  195. u16 timeout;
  196. u8 c;
  197. volatile u8 *pdata;
  198.     /* Put the Flash in normal mode */    
  199.     *(volatile char *)FLASH_START = (char)0xf0;
  200.     flash_erase((u32)flashnext, (u32)nBytes);
  201. while(nBytes--)
  202. {
  203. /* Prep AMD
  204.  * 32MBit (4M x 8) Flash Memory
  205.  * for writing a byte.
  206.  */
  207. *FLASH_PAGE = (u8)(((u32)flashnext & 0x380000) >> 19);
  208. *(volatile char *)(FLASH_START+0xaaa) = (char)FLASH_KEY1;/*change*/
  209. *(volatile char *)(FLASH_START+0x555) = (char)FLASH_KEY2;
  210. *(volatile char *)(FLASH_START+0xaaa) = (char)FLASH_KEY3;
  211.         pdata = (volatile u8 *)((u32)flashnext & 0xffc7ffff);
  212. *pdata = *data;
  213. /* Spin here 'til programming completes
  214.  */
  215. c = *data++;
  216. timeout = 0;
  217. do timeout += 1;
  218. while(*pdata != c && timeout < (u16)0xffff);
  219. flashnext++;
  220. }
  221.     /* Put the Flash in normal mode */    
  222.     *(volatile char *)FLASH_START = (char)0xf0;
  223. }
  224. /* The Flash Erase function uses
  225.  * the AMD algorithm to erase the
  226.  * entire chip.
  227.  */
  228. void EraseFlash(void)
  229. {
  230.     int i;
  231. /* Code to erase AMD29LV033C
  232.  * 32MBit (4MK X 8) Flash Memory
  233.  */
  234. *FLASH_PAGE = 0;
  235. *(volatile char *)(FLASH_START+0xaaa) = (char)FLASH_KEY1;/*change*/
  236. *(volatile char *)(FLASH_START+0x555) = (char)FLASH_KEY2;
  237. *(volatile char *)(FLASH_START+0xaaa) = (char)FLASH_KEY4;
  238. *(volatile char *)(FLASH_START+0xaaa) = (char)FLASH_KEY1;
  239. *(volatile char *)(FLASH_START+0x555) = (char)FLASH_KEY2;
  240. *(volatile char *)(FLASH_START+0xaaa) = (char)FLASH_KEY5;
  241.     /* Wait until erase is done */
  242. while(GetFlashVal(FLASH_START) != 0xff);
  243.     /* Put the Flash in normal mode */    
  244.     *(volatile char *)FLASH_START = (char)0xf0;
  245.     /* Mark all sectors as erased */
  246.     for (i = 0; i < FLASH_SECTORS; i++)
  247.         erasetable[i] = 1;
  248.     
  249. return;
  250. }
  251. void CKSSet(u16 val)
  252. {
  253. cksum = val;
  254. }
  255. u16 CKSGet(void)
  256. {
  257. return (u16)cksum;
  258. }
  259. u16 CKSAccumBuf(unsigned char *buf, unsigned int len)
  260. {
  261.     unsigned long src;
  262.    
  263.     src = (unsigned long)buf;
  264. while(len-- > 0)
  265. {
  266. cksum += GetFlashVal(src++);
  267. if(cksum > (unsigned long)0x0000ffff)
  268. {
  269. cksum += 1;
  270. cksum &= (unsigned long)0x0000ffff;
  271. }
  272. return (u16)cksum;
  273. }
  274. u8 GetFlashVal(unsigned long addr)
  275. {
  276. *FLASH_PAGE = (u8)(((u32)addr & 0x380000) >> 19);
  277. return *(volatile u8 *)(addr & 0xffc7ffff);
  278. }
  279. void SendFlashBufToHost(u16 cmd, unsigned long addr, u16 bytecount)
  280. {
  281.     u8 *pflash = (u8 *)addr;
  282.     u16 n = bytecount > 256 ? 256 : bytecount;
  283. StoreCmd(cmd);     
  284. StoreArg(0, bytecount);
  285.     
  286. GetFlashBuf(GetData(), pflash, n);
  287. }
  288. static GetFlashBuf(u8 *dest, u8 *flashsrc, u16 nBytes)
  289. {
  290.     unsigned long src, dst, i;
  291.     src = (unsigned long)flashsrc;
  292.     dst = (unsigned long)dest;
  293.     
  294.     for (i = 0; i < nBytes; i++)
  295.     {
  296.         *((u8 *)dst++) = GetFlashVal(src++);
  297.     }
  298. }