日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一个 NAND flash写函数

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

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

  • 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;??
  • } ?



  • 總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。