一个 NAND flash写函数


  1. 一个刚看到时有点晕晕的flash的写函数,后来仔细看了后明白了;附上我的草稿图 

  2. int tls_fls_write(u32 addr, u8 *buf, u32 len)  
  3. {  
  4.     u8 *cache;  
  5.     int err;  
  6.     u32 sector_addr;  
  7.     u32 sector_num;  
  8.     u32 write_bytes;  
  9.     u32 i;  
  10.     struct tls_fls_drv *drv;  
  11.   
  12.     if (spi_fls == NULL)  
  13.     {  
  14.         TLS_DBGPRT_ERR("flash driver module not beed installed!\n");  
  15.         return TLS_FLS_STATUS_EPERM;  
  16.     }  
  17.       
  18.     if (spi_fls->current_drv == NULL)  
  19.     {  
  20.         TLS_DBGPRT_ERR("the current spi flash driver not installed!\n");  
  21.         return TLS_FLS_STATUS_ENODRV;  
  22.     }  
  23.       
  24.     if ((addr >= spi_fls->current_drv->total_size) || (len == 0)  
  25.         || (buf == NULL))  
  26.     {  
  27.         return TLS_FLS_STATUS_EINVAL;  
  28.     }  
  29.     tls_os_sem_acquire(spi_fls->fls_lock, 0);  
  30.     drv = spi_fls->current_drv;  
  31.     write_bytes =  
  32.         ((addr + len) > drv->total_size) ? (drv->total_size - addr) : len;  
  33.     sector_addr = addr/drv->sector_size;  
  34.     sector_num = (addr + write_bytes - 1)/drv->sector_size - sector_addr + 1;  
  35.   
  36.     TLS_DBGPRT_FLASH("write to flash: sector address - %d, sectors - %d.\n", sector_addr, sector_num);  
  37.       
  38.     err = TLS_FLS_STATUS_OK;  
  39.   
  40.     cache = tls_mem_alloc(drv->sector_size);  
  41.     if (cache == NULL)  
  42.     {  
  43.         tls_os_sem_release(spi_fls->fls_lock);  
  44.         TLS_DBGPRT_ERR("allocate sector cache memory(%dB) fail!\n", drv->sector_size);  
  45.         return TLS_FLS_STATUS_ENOMEM;  
  46.     }  
  47.   
  48.     for (i = 0; i < sector_num; i++)  
  49.     {  
  50.         TLS_DBGPRT_FLASH("firstly, read the sector - %d to cache.\n", sector_addr + i);  
  51.         err = drv->read((sector_addr + i) * drv->sector_size, cache, drv->sector_size);  
  52.         if (err != TLS_FLS_STATUS_OK)  
  53.         {  
  54.             tls_os_sem_release(spi_fls->fls_lock);  
  55.             TLS_DBGPRT_ERR("flash read fail(sector %d)!\n", (sector_addr + i));  
  56.             break;  
  57.         }  
  58.   
  59.         if (1 == sector_num){/*flash write only in one sector*/  
  60.             MEMCPY(cache + (addr%drv->sector_size), buf, write_bytes);     
  61.             buf += write_bytes;  
  62.             write_bytes = 0;              
  63.         }else{/*flash write through some sectors*/  
  64.             if (0 == i) {  
  65.                 MEMCPY(cache+(addr%drv->sector_size), buf, drv->sector_size - (addr%drv->sector_size));  
  66.                 buf += drv->sector_size - (addr%drv->sector_size);  
  67.                 write_bytes -drv->sector_size - (addr%drv->sector_size);  
  68.             } else if (i == (sector_num - 1)) {  
  69.                 MEMCPY(cache, buf, write_bytes);  
  70.                 buf += write_bytes;  
  71.                 write_bytes = 0;  
  72.             } else {  
  73.                 MEMCPY(cache, buf, drv->sector_size);  
  74.                 buf += drv->sector_size;  
  75.                 write_bytes -drv->sector_size;  
  76.             }  
  77.         }  
  78.   
  79.         TLS_DBGPRT_FLASH("second, erase the sector - %d.\n", sector_addr + i);  
  80.         err = drv->erase(sector_addr + i);  
  81.         if (err != TLS_FLS_STATUS_OK)  
  82.         {  
  83.             tls_os_sem_release(spi_fls->fls_lock);  
  84.             TLS_DBGPRT_ERR("flash erase fail(sector %d)!\n", (sector_addr + i));  
  85.             break;  
  86.         }  
  87.   
  88.         TLS_DBGPRT_FLASH("finnaly, write the data in cache to the sector - %d.\n", sector_addr + i);  
  89.         err = tls_fls_page_write((sector_addr +i) * (drv->sector_size / drv->page_size),  
  90.                             cache, drv->sector_size / drv->page_size);  
  91.         if (err != TLS_FLS_STATUS_OK)  
  92.         {  
  93.             tls_os_sem_release(spi_fls->fls_lock);  
  94.             TLS_DBGPRT_ERR("flash write fail(sector %d)!\n", (sector_addr + i));  
  95.             break;  
  96.         }  
  97.     }  
  98.   
  99.     tls_mem_free(cache);  
  100.     tls_os_sem_release(spi_fls->fls_lock);  
  101.     return err;  
  102. }  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值