flashFsLib.c
上传用户:dqzhongke1
上传日期:2022-06-26
资源大小:667k
文件大小:12k
源码类别:

VxWorks

开发平台:

C/C++

  1. /*
  2.  * $Id: flashFsLib.c,v 1.8 Broadcom SDK $
  3.  * $Copyright: Copyright 2008 Broadcom Corporation.
  4.  * This program is the proprietary software of Broadcom Corporation
  5.  * and/or its licensors, and may only be used, duplicated, modified
  6.  * or distributed pursuant to the terms and conditions of a separate,
  7.  * written license agreement executed between you and Broadcom
  8.  * (an "Authorized License").  Except as set forth in an Authorized
  9.  * License, Broadcom grants no license (express or implied), right
  10.  * to use, or waiver of any kind with respect to the Software, and
  11.  * Broadcom expressly reserves all rights in and to the Software
  12.  * and all intellectual property rights therein.  IF YOU HAVE
  13.  * NO AUTHORIZED LICENSE, THEN YOU HAVE NO RIGHT TO USE THIS SOFTWARE
  14.  * IN ANY WAY, AND SHOULD IMMEDIATELY NOTIFY BROADCOM AND DISCONTINUE
  15.  * ALL USE OF THE SOFTWARE.  
  16.  *  
  17.  * Except as expressly set forth in the Authorized License,
  18.  *  
  19.  * 1.     This program, including its structure, sequence and organization,
  20.  * constitutes the valuable trade secrets of Broadcom, and you shall use
  21.  * all reasonable efforts to protect the confidentiality thereof,
  22.  * and to use this information only in connection with your use of
  23.  * Broadcom integrated circuit products.
  24.  *  
  25.  * 2.     TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS
  26.  * PROVIDED "AS IS" AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES,
  27.  * REPRESENTATIONS OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY,
  28.  * OR OTHERWISE, WITH RESPECT TO THE SOFTWARE.  BROADCOM SPECIFICALLY
  29.  * DISCLAIMS ANY AND ALL IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY,
  30.  * NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES,
  31.  * ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR
  32.  * CORRESPONDENCE TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING
  33.  * OUT OF USE OR PERFORMANCE OF THE SOFTWARE.
  34.  * 
  35.  * 3.     TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL
  36.  * BROADCOM OR ITS LICENSORS BE LIABLE FOR (i) CONSEQUENTIAL,
  37.  * INCIDENTAL, SPECIAL, INDIRECT, OR EXEMPLARY DAMAGES WHATSOEVER
  38.  * ARISING OUT OF OR IN ANY WAY RELATING TO YOUR USE OF OR INABILITY
  39.  * TO USE THE SOFTWARE EVEN IF BROADCOM HAS BEEN ADVISED OF THE
  40.  * POSSIBILITY OF SUCH DAMAGES; OR (ii) ANY AMOUNT IN EXCESS OF
  41.  * THE AMOUNT ACTUALLY PAID FOR THE SOFTWARE ITSELF OR U.S. $1,
  42.  * WHICHEVER IS GREATER. THESE LIMITATIONS SHALL APPLY NOTWITHSTANDING
  43.  * ANY FAILURE OF ESSENTIAL PURPOSE OF ANY LIMITED REMEDY.$
  44.  */
  45. #include "types.h"
  46. #include "vxWorks.h"
  47. #include "stdio.h"
  48. #include "stdlib.h"
  49. #include "errno.h"
  50. #include "ioLib.h"
  51. #include "dosFsLib.h"
  52. #include "fioLib.h"
  53. #include "blkIo.h"
  54. #include "string.h"
  55. #include "flashFsConfig.h"
  56. #include "flashDrvLib.h"
  57. #include "flashFsLib.h"
  58. #include "errnoLib.h"
  59. #include "config.h"
  60. BLK_DEV         flashBlkDev;
  61. int             flashDosFormat = 0;
  62. int             flashBootSize = 1024*1024;
  63. int             flashFsSize = 1;
  64. int             flashFsSectorStart = 0; /* 5 for A1 */
  65. int             flash_boot_start  = 0x7f00000; /* 0x0 for A1 */
  66. int             flash_nvram_start = 0x7f00000; 
  67. static device_t        flashFsLibXbdDev = 0;
  68. extern device_t        xbdBlkDevCreate (BLK_DEV *bd, const char *name);
  69. DOS_VOLUME_DESC_ID     flashDosVolDesc = 0;
  70. int             flashFsVerbose = 0;
  71. /*
  72.  * CFE partition table
  73.  */
  74. #define PTABLE_MAGIC           0x5054424C /* 'PTBL' (big-endian) */
  75. #define PTABLE_MAGIC_LE        0x4C425450 /* 'PTBL' (little-endian) */
  76. #define PTABLE_PNAME_MAX       16
  77. #define PTABLE_MAX_PARTITIONS  8
  78. typedef struct partition_s {
  79.     char            name[PTABLE_PNAME_MAX];
  80.     unsigned int    offset;
  81.     unsigned int    size;
  82.     unsigned int    type;
  83.     unsigned int    flags;
  84. } partition_t;
  85. typedef struct ptable_s {
  86.     unsigned int    magic;
  87.     unsigned int    version;
  88.     unsigned int    chksum;
  89.     unsigned int    reserved;
  90.     partition_t     part[PTABLE_MAX_PARTITIONS];
  91. } ptable_t;
  92. STATUS
  93. flashFsCheckPtable(ptable_t *ptbl, const char *pname,
  94.                    int *psize, int *poffset)
  95. {
  96.         unsigned int    chksum, u32, *p32;
  97.         int             i, swapped = 0;
  98.         if (ptbl->magic == PTABLE_MAGIC_LE) {
  99.                 swapped = 1;
  100.         }
  101.         else if (ptbl->magic != PTABLE_MAGIC) {
  102.                 return ERROR;
  103.         }
  104.         chksum = 0;
  105.         p32 = (unsigned int*)ptbl;
  106.         for (i = 0; i < sizeof(ptable_t)/4; i++) {
  107.                 chksum ^= p32[i];
  108.                 if (swapped) {
  109.                         swab((char*)&p32[i], (char*)&u32, 4);
  110.                         p32[i] = u32;
  111.                 }
  112.         }
  113.         if (chksum != 0) {
  114.                 return ERROR;
  115.         }
  116.         for (i = 0; i < PTABLE_MAX_PARTITIONS && ptbl->part[i].size; i++) {
  117.             /*
  118.              * We consider the boot partition to span the all partitions
  119.              * up to the first VxWorks compatible filesystem.
  120.              */
  121.             if (strcmp(ptbl->part[i].name, pname) == 0) {
  122.                 *psize = ptbl->part[i].size;
  123.                 *poffset = ptbl->part[i].offset;
  124.                 return OK;
  125.             }
  126.         }
  127.         return ERROR;
  128. }
  129. STATUS
  130. flashFsGetPhys(int blkNum, int *sectorNum, int *offset)
  131. {
  132.     int sect;
  133.     if (blkNum >= FLASH_FS_SIZE_BLOCKS)
  134. return (ERROR);
  135.     sect = blkNum / FLASH_FS_BLOCK_PER_SECTOR;
  136.     sect += flashFsSectorStart;
  137.     if ((flashFsSectorStart < FLASH_BOOT_START_SECTOR) &&
  138.         (sect >= FLASH_BOOT_START_SECTOR)) {
  139. /* Skip boot sector */
  140. sect += FLASH_BOOT_SIZE_SECTORS;
  141.     }
  142.     if ((flashFsSectorStart < FLASH_NVRAM_START_SECTOR) &&
  143.         (sect >= FLASH_NVRAM_START_SECTOR)) {
  144. /* Skip boot sector */
  145. sect += FLASH_NVRAM_SIZE_SECTORS;
  146.     }
  147.     *sectorNum = sect;
  148.     *offset = (blkNum % FLASH_FS_BLOCK_PER_SECTOR) * FLASH_FS_BLOCK_SIZE;
  149.     if (flashFsVerbose > 2)
  150. printf("flashFsGetPhys(): blkNum = %d, "
  151.        "*sectorNum = %d, *offset = 0x%xn",
  152.        blkNum, *sectorNum, *offset);
  153.     return (OK);
  154. }
  155. STATUS
  156. flashFsBlkRead(BLK_DEV *pDev, int startBlk, int numBlks, char *pBuf)
  157. {
  158.     int             blkIndx, phySectorNum, offset;
  159.     if (flashFsVerbose > 1)
  160. printf("flashFsBlkRead(): startBlk = %d, numBlks = %dn",
  161.        startBlk, numBlks);
  162.     for (blkIndx = 0; blkIndx < numBlks; blkIndx++) {
  163. if (flashFsGetPhys((startBlk + blkIndx), &phySectorNum, &offset) ==
  164.     ERROR) {
  165.     if (flashFsVerbose)
  166. printf("flashFsBlkRead(): flashFsGetPhys() failedn");
  167.     return (ERROR);
  168. }
  169. if (flashBlkRead(phySectorNum, pBuf,
  170.  offset, FLASH_FS_BLOCK_SIZE) == ERROR) {
  171.     if (flashFsVerbose)
  172. printf("flashFsBlkRead(): flashBlkRead() failedn");
  173.     return (ERROR);
  174. }
  175. pBuf += FLASH_FS_BLOCK_SIZE;
  176.     }
  177.     return (OK);
  178. }
  179. STATUS
  180. flashFsBlkWrite(BLK_DEV *pDev, int startBlk, int numBlks, char *pBuf)
  181. {
  182.     int             blkIndx, phySectorNum, offset;
  183.     if (flashFsVerbose > 1)
  184. printf("flashFsBlkWrite(): startBlk = %d, numBlks = %dn",
  185.        startBlk, numBlks);
  186.     for (blkIndx = 0; blkIndx < numBlks; blkIndx++) {
  187. if (flashFsGetPhys((startBlk + blkIndx), &phySectorNum, &offset) ==
  188.     ERROR) {
  189.     printf("flashFsBlkWrite(): flashFsGetPhys() failedn");
  190.     return (ERROR);
  191. }
  192. if (flashBlkWrite(phySectorNum, pBuf,
  193.   offset, FLASH_FS_BLOCK_SIZE) == ERROR) {
  194.     printf("flashFsBlkWrite(): flashBlkWrite() failedn");
  195.     return (ERROR);
  196. }
  197. pBuf += FLASH_FS_BLOCK_SIZE;
  198.     }
  199.     return (OK);
  200. }
  201. STATUS
  202. flashSync(void)
  203. {
  204.     int             flashFd = 0;
  205.     STATUS          rc;
  206.     if ((flashFd = open(FLASH_FS_NAME, O_RDWR, 0666)) == ERROR) {
  207. printf("flashSync(): open() failedn");
  208.     }
  209.     rc = ioctl(flashFd, FLASH_FS_SYNC, 0);
  210.     close(flashFd);
  211.     return rc;
  212. }
  213. STATUS
  214. flashFsIoctl(BLK_DEV *pDev, int funcCode, int arg)
  215. {
  216.     int sectorAfterBoot;
  217.     if (flashFsVerbose > 1)
  218. printf("flashFsBlkIoctl(): calledn");
  219.     switch (funcCode) {
  220.     case FIODISKFORMAT:
  221. /* Clear flashDrvLib's cached sector */
  222. if (flashDrvLibInit() == ERROR) {
  223.     printf("flashFsLibInit(): flashDrvLibInit() failedn");
  224.     return (ERROR);
  225. }
  226. /* From beginning of flash to beginning of Boot Area */
  227. if (flashEraseBank(0, FLASH_BOOT_START_SECTOR) == ERROR) {
  228.     return (ERROR);
  229. }
  230. sectorAfterBoot = FLASH_BOOT_START_SECTOR + FLASH_BOOT_SIZE_SECTORS;
  231. /* From end of Boot Area to end of flash */
  232. if (flashEraseBank(sectorAfterBoot,
  233.    FLASH_SIZE_SECTORS - sectorAfterBoot) == ERROR) {
  234.     return (ERROR);
  235. }
  236. break;
  237.     case FLASH_FS_SYNC:
  238. flashSyncFilesystem();
  239. break;
  240.     default:
  241. errnoSet(S_ioLib_UNKNOWN_REQUEST);
  242. return (ERROR);
  243. break;
  244.     }
  245.     return (OK);
  246. }
  247. int
  248. tstFlashFile(void)
  249. {
  250.     int             fh;
  251.     char            buff[20];
  252.     printf("creatingn");
  253.     fh = creat("myfile", O_RDWR);
  254.     if (fh < 0) {
  255. printf("tstFlashFile(): create() failedn");
  256. return (ERROR);
  257.     }
  258.     printf("writingn");
  259.     write(fh, buff, 10);
  260.     printf("closingn");
  261.     close(fh);
  262.     return (0);
  263. }
  264. int
  265. tstFlashFile_1(void)
  266. {
  267.     int             fh;
  268.     char            buff[40];
  269.     printf("openingn");
  270.     fh = open("myfile", O_RDWR, 0664);
  271.     if (fh < 0) {
  272. printf("tstFlashFile_1(): open() failedn");
  273. return (ERROR);
  274.     }
  275.     printf("writingn");
  276.     write(fh, buff, 10);
  277.     printf("writingn");
  278.     write(fh, buff, 23);
  279.     printf("closingn");
  280.     close(fh);
  281.     return (0);
  282. }
  283. STATUS
  284. flashFsLibInit(void)
  285. {
  286.     int         bootSize, bootOffset;
  287.     int         fsSize, fsOffset, tmp;
  288.     /* 
  289.      * We are considered initialized once flashDosVolDesc is non-NULL.
  290.      */
  291.     if (flashDosVolDesc) {
  292. return OK;
  293.     }
  294.     if (flashDrvLibInit() == ERROR) {
  295. printf("flashFsLibInit(): flashDrvLibInit() failedn");
  296. return (ERROR);
  297.     }
  298.     flash_boot_start = 0x7f00000;
  299.     /* Align with flash sector */
  300.     flash_nvram_start = flash_boot_start - 
  301.                         ((FLASH_NVRAM_SIZE + (FLASH_SECTOR_SIZE - 1)) / 
  302.                          FLASH_SECTOR_SIZE);
  303.     /* Assume boot sector to be 1MB initially. */
  304.     flashBootSize = 1024*1024; 
  305.     bootOffset = FLASH_BOOT_START;
  306.     /* Assume using enire flash */
  307.     flashFsSize = flashSize - flashBootSize - FLASH_NVRAM_SIZE;
  308.     /* 
  309.      * Set up BLK DEV structure
  310.      */
  311.     flashBlkDev.bd_blkRd = flashFsBlkRead;
  312.     flashBlkDev.bd_blkWrt = flashFsBlkWrite;
  313.     flashBlkDev.bd_ioctl = flashFsIoctl;
  314.     flashBlkDev.bd_reset = NULL;
  315.     flashBlkDev.bd_statusChk = NULL;
  316.     flashBlkDev.bd_removable = FALSE;
  317.     flashBlkDev.bd_nBlocks = FLASH_FS_SIZE_BLOCKS + 1;
  318.     flashBlkDev.bd_bytesPerBlk = FLASH_FS_BLOCK_SIZE;
  319.     flashBlkDev.bd_blksPerTrack = 1;
  320.     flashBlkDev.bd_nHeads = 1;
  321.     flashBlkDev.bd_retry = 1;
  322.     flashBlkDev.bd_mode = O_RDWR;
  323.     flashBlkDev.bd_readyChanged = FALSE;
  324.     if (flashFsVerbose) {
  325. printf("flashFsLibInit: Initializingn");
  326.     }
  327.     {
  328.         char fsmName[12];
  329.         sprintf (fsmName, "%s:0", FLASH_FS_NAME); /* Create name for mapping. */
  330.         fsmNameInstall (fsmName, FLASH_FS_NAME);  /* Install name mapping. */
  331.         if ((flashFsLibXbdDev = 
  332.              xbdBlkDevCreate(&flashBlkDev, FLASH_FS_NAME)) == NULLDEV) {
  333.             printf("flashFsLibInit: failed to created xdb device !!n");
  334.             return (ERROR);
  335.         }
  336.         if (dosFsDevCreate(FLASH_FS_NAME, flashFsLibXbdDev, 
  337.                            DOSFS_DEFAULT_MAX_FILES, DOS_CHK_NONE)) {
  338.             printf("Failed to create DOS file device n");
  339.             return (ERROR);
  340.         }
  341.         flashDosVolDesc = dosFsVolDescGet(FLASH_FS_NAME, NULL);
  342.         if (flashDosVolDesc == NULL) {
  343.             if (flashFsVerbose) {
  344.                 printf("nflashFsLibInit: first time initialization...n");
  345.             }
  346.             dosFsVolFormat(FLASH_FS_NAME, DOS_OPT_DEFAULT, NULL);
  347.             flashDosVolDesc = dosFsVolDescGet(FLASH_FS_NAME, NULL);
  348.             if (flashDosVolDesc == NULL) {
  349.                 printf("Failed to Format DOS file device n");
  350.                 return (ERROR);
  351.             }
  352.         }
  353.         
  354.         if (flashFsVerbose) {
  355.             dosFsShow(FLASH_FS_NAME, DOS_CHK_VERB_2);
  356.         }
  357.     }
  358.     flashFsSync();
  359.     return OK;
  360. }
  361. STATUS
  362. flashFsSync(void)
  363. {
  364. /*    if (flashDosVolDesc) { */
  365. if (flashFsVerbose) {
  366.     printf("flashFsSync(): Syncing...");
  367. }
  368. flashSyncFilesystem();
  369. if (flashFsVerbose) {
  370.     printf("donen");
  371. }
  372. /*    } */
  373.     return OK;
  374. }