日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

一个 NAND flash写函数

發(fā)布時間:2025/4/5 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个 NAND flash写函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  • 一個剛看到時有點暈暈的flash的寫函數(shù),后來仔細看了后明白了;附上我的草稿圖?

  • int?tls_fls_write(u32?addr,?u8?*buf,?u32?len)??
  • {??
  • ????u8?*cache;??
  • ????int?err;??
  • ????u32?sector_addr;??
  • ????u32?sector_num;??
  • ????u32?write_bytes;??
  • ????u32?i;??
  • ????struct?tls_fls_drv?*drv;??
  • ??
  • ????if?(spi_fls?==?NULL)??
  • ????{??
  • ????????TLS_DBGPRT_ERR("flash?driver?module?not?beed?installed!\n");??
  • ????????return?TLS_FLS_STATUS_EPERM;??
  • ????}??
  • ??????
  • ????if?(spi_fls->current_drv?==?NULL)??
  • ????{??
  • ????????TLS_DBGPRT_ERR("the?current?spi?flash?driver?not?installed!\n");??
  • ????????return?TLS_FLS_STATUS_ENODRV;??
  • ????}??
  • ??????
  • ????if?((addr?>=?spi_fls->current_drv->total_size)?||?(len?==?0)??
  • ????????||?(buf?==?NULL))??
  • ????{??
  • ????????return?TLS_FLS_STATUS_EINVAL;??
  • ????}??
  • ????tls_os_sem_acquire(spi_fls->fls_lock,?0);??
  • ????drv?=?spi_fls->current_drv;??
  • ????write_bytes?=??
  • ????????((addr?+?len)?>?drv->total_size)???(drv->total_size?-?addr)?:?len;??
  • ????sector_addr?=?addr/drv->sector_size;??
  • ????sector_num?=?(addr?+?write_bytes?-?1)/drv->sector_size?-?sector_addr?+?1;??
  • ??
  • ????TLS_DBGPRT_FLASH("write?to?flash:?sector?address?-?%d,?sectors?-?%d.\n",?sector_addr,?sector_num);??
  • ??????
  • ????err?=?TLS_FLS_STATUS_OK;??
  • ??
  • ????cache?=?tls_mem_alloc(drv->sector_size);??
  • ????if?(cache?==?NULL)??
  • ????{??
  • ????????tls_os_sem_release(spi_fls->fls_lock);??
  • ????????TLS_DBGPRT_ERR("allocate?sector?cache?memory(%dB)?fail!\n",?drv->sector_size);??
  • ????????return?TLS_FLS_STATUS_ENOMEM;??
  • ????}??
  • ??
  • ????for?(i?=?0;?i?<?sector_num;?i++)??
  • ????{??
  • ????????TLS_DBGPRT_FLASH("firstly,?read?the?sector?-?%d?to?cache.\n",?sector_addr?+?i);??
  • ????????err?=?drv->read((sector_addr?+?i)?*?drv->sector_size,?cache,?drv->sector_size);??
  • ????????if?(err?!=?TLS_FLS_STATUS_OK)??
  • ????????{??
  • ????????????tls_os_sem_release(spi_fls->fls_lock);??
  • ????????????TLS_DBGPRT_ERR("flash?read?fail(sector?%d)!\n",?(sector_addr?+?i));??
  • ????????????break;??
  • ????????}??
  • ??
  • ????????if?(1?==?sector_num){/*flash?write?only?in?one?sector*/??
  • ????????????MEMCPY(cache?+?(addr%drv->sector_size),?buf,?write_bytes);?????
  • ????????????buf?+=?write_bytes;??
  • ????????????write_bytes?=?0;??????????????
  • ????????}else{/*flash?write?through?some?sectors*/??
  • ????????????if?(0?==?i)?{??
  • ????????????????MEMCPY(cache+(addr%drv->sector_size),?buf,?drv->sector_size?-?(addr%drv->sector_size));??
  • ????????????????buf?+=?drv->sector_size?-?(addr%drv->sector_size);??
  • ????????????????write_bytes?-=?drv->sector_size?-?(addr%drv->sector_size);??
  • ????????????}?else?if?(i?==?(sector_num?-?1))?{??
  • ????????????????MEMCPY(cache,?buf,?write_bytes);??
  • ????????????????buf?+=?write_bytes;??
  • ????????????????write_bytes?=?0;??
  • ????????????}?else?{??
  • ????????????????MEMCPY(cache,?buf,?drv->sector_size);??
  • ????????????????buf?+=?drv->sector_size;??
  • ????????????????write_bytes?-=?drv->sector_size;??
  • ????????????}??
  • ????????}??
  • ??
  • ????????TLS_DBGPRT_FLASH("second,?erase?the?sector?-?%d.\n",?sector_addr?+?i);??
  • ????????err?=?drv->erase(sector_addr?+?i);??
  • ????????if?(err?!=?TLS_FLS_STATUS_OK)??
  • ????????{??
  • ????????????tls_os_sem_release(spi_fls->fls_lock);??
  • ????????????TLS_DBGPRT_ERR("flash?erase?fail(sector?%d)!\n",?(sector_addr?+?i));??
  • ????????????break;??
  • ????????}??
  • ??
  • ????????TLS_DBGPRT_FLASH("finnaly,?write?the?data?in?cache?to?the?sector?-?%d.\n",?sector_addr?+?i);??
  • ????????err?=?tls_fls_page_write((sector_addr?+i)?*?(drv->sector_size?/?drv->page_size),??
  • ????????????????????????????cache,?drv->sector_size?/?drv->page_size);??
  • ????????if?(err?!=?TLS_FLS_STATUS_OK)??
  • ????????{??
  • ????????????tls_os_sem_release(spi_fls->fls_lock);??
  • ????????????TLS_DBGPRT_ERR("flash?write?fail(sector?%d)!\n",?(sector_addr?+?i));??
  • ????????????break;??
  • ????????}??
  • ????}??
  • ??
  • ????tls_mem_free(cache);??
  • ????tls_os_sem_release(spi_fls->fls_lock);??
  • ????return?err;??
  • } ?



  • 總結

    以上是生活随笔為你收集整理的一个 NAND flash写函数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。