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