FujiokaHaruhi_ 2021-05-30 10:47 采纳率: 0%
浏览 13

nand flash 驱动程序 有一点看不明白

 

 

struct nandflash_addrst
{
    uint32_t Col_addr :12;//  bit11:bit0 
    uint32_t Page_addr :6;//  bit17:bit12
    uint32_t Block_addr :11;//  bit31:bit18
    uint32_t Rsvd_addr :3; //±£Áô
};

typedef union AddrMore_st
{
    uint32_t all;
    struct nandflash_addrst bit;
} addr_more_t;

 

addr_more_t nand_flash_addr_convt(uint32_t addr) //物理地址转换
{
    addr_more_t tempaddr;
    addr_more_t flash_addr;
    tempaddr.all = addr;
    flash_addr.all =0;
    flash_addr.bit.Block_addr = tempaddr.bit.Block_addr;
    uint32_t temp = (2*tempaddr.bit.Page_addr);
    flash_addr.all+=(temp<<12);
    while(1)
    {
        if(tempaddr.bit.Col_addr>=nd_page_bytesize) //1 page
        {
            flash_addr.all+=0x1000;
            tempaddr.bit.Col_addr-=nd_page_bytesize;
        }
        else
        {
            break;
        }
    }
    flash_addr.bit.Col_addr = tempaddr.bit.Col_addr;
return flash_addr;
}
 

  • 写回答

1条回答 默认 最新

  • ★雨 潇★ 2024-05-22 11:09
    关注

    这段代码定义了一个用于NAND Flash地址转换的数据结构和函数。下面我将解释代码的各个部分:

    struct nandflash_addrst:这是一个结构体,用于表示NAND Flash的地址结构。它包含了三个地址域和一个保留位域。每个域都使用了位域(bit field)来定义其占用的位数。

    Col_addr:占用12位,表示列地址(bit 11:0)。
    Page_addr:占用6位,表示页地址(bit 17:12)。
    Block_addr:占用11位,表示块地址(bit 31:18)。
    Rsvd_addr:占用3位,表示保留位(通常用于未来扩展或特定设备的特殊用途)。
    typedef union AddrMore_st:这是一个联合体(union),用于将整个地址作为一个32位的整数或者一个结构体来处理。

    all:表示整个32位的地址。
    bit:表示包含各个地址域的结构体。
    addr_more_t nand_flash_addr_convt(uint32_t addr):这是一个函数,用于将给定的32位物理地址转换为NAND Flash内部的地址格式。

    tempaddr.all = addr;:将传入的物理地址赋值给临时变量tempaddr的all成员。
    flash_addr.all = 0;:初始化结果变量flash_addr的all成员为0,以便开始构建新的地址。
    flash_addr.bit.Block_addr = tempaddr.bit.Block_addr;:将原始地址中的块地址复制到结果地址中。
    uint32_t temp = (2 * tempaddr.bit.Page_addr);:计算页地址的两倍,因为通常NAND Flash的一个页分为两个半页(upper page和lower page)。
    flash_addr.all += (temp << 12);:将计算出的页地址左移12位(相当于乘以4096,即1页的字节数),并加到结果地址中。
    接下来的while循环用于处理列地址。如果列地址超过了每页的字节数(nd_page_bytesize),则说明需要跨越多页,因此在结果地址中加上一页的字节数(0x1000),并更新列地址。
    最后,将剩余的列地址复制到结果地址中,并返回结果地址。
    这段代码的目的是将一个32位的物理地址转换为适用于NAND Flash的地址格式,考虑到NAND Flash的块、页、列的层次结构。转换后的地址可以用于读取、写入或擦除NAND Flash中的数据。注意,代码中的nd_page_bytesize应该是一个宏或常量,表示NAND Flash中每一页的字节数。

    评论

报告相同问题?

悬赏问题

  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同