SylixOS下DMA操作带cache的地址时的处理

来源:互联网 发布:linux编译程序 编辑:程序博客网 时间:2024/06/01 09:43
    DMA只操作物理内存,不会操作cache,但CPU却先操作cache,这样就会造成数据不一致的问题。因此,对于一块带cache缓冲的地址要用DMA传输的话,需要经过特殊的处理。
    linux下可以通过dma_map_single、dma_unmap_single函数来得到对应的物理地址,并根据数据的方向判断是该回写cache还是无效cache。
    SylixO中可以利用API_VmmVirtualToPhysical来得到对应的物理地址,但对cache的操作需要手动进行。以nand的读写为例。

    static void read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
    {
           int i;
           struct nand_chip *chip = mtd->priv;

           API_VmmVirtualToPhysical((addr_t)buf, (addr_t *)(&RX));

           __uartDmaRequest(mtd, (void *)RX, len, 1);      
          API_CacheInvalidate(DATA_CACHE, buf, len);     /* DCACHE 使指定的页面无效(访问不命中)*/     
    }
    将nand里面的数据拷贝到参数buf下,拷贝完成后,需要将buf对应的cache line无效。

    static void write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
    {
          int i;
          struct nand_chip *chip = mtd->priv;
          API_VmmVirtualToPhysical((addr_t)buf, (addr_t *)(&TX));     /* 指定类型的 CACHE 将所有或者指定的数据项清空*/
          API_CacheFlush(DATA_CACHE, (PVOID)buf, len);
         __uartDmaRequest(mtd, (VOID *)TX, len, 0);
     }
    将buf里面的数据写到nand里面,写之前,需要将buf对应的cache line回写。
原创粉丝点击