新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > linux dma cache

        linux dma cache

        作者: 時間:2012-04-12 來源:網絡 收藏

        void _sync_single_for_device(struct device *dev,_handle_t bus_addr, size_t size, enum _data_direction direction);如果設備要求較大的DMA緩沖區,在其支持SG模式的情況下,申請多個不連續的,相對較小的DMA緩沖區通常是防止申請太大的連續物理空間的方法,在Linux內核中,使用如下函數映射SG:

        int dma_map_sg(struct device *dev,struct scatterlist *sg, int nents,enum dma_data_direction direction); 其中nents是散列表入口的數量,該函數的返回值是DMA緩沖區的數量,可能小于nents。對于scatterlist中的每個項目,dma_map_sg()為設備產生恰當的總線地址,它會合并物理上臨近的內存區域。下面在給出scatterlist結構:

        struct scatterlist

        {

        struct page *page;

        unsigned int offset; //偏移量

        dma_addr_t dma_address; //總線地址

        unsigned int length; //緩沖區長度

        }

        執行dma_map_sg()后,通過sg_dma_address()后可返回scatterlist對應緩沖區的總線結構,sg_dma_len()可返回scatterlist對應的緩沖區的長度,這兩個函數的原型是:

        dma_addr_t sg_dma_address(struct scatterlist *sg); unsigned int sg_dma_len(struct scatterlist *sg);

        在DMA傳輸結束后,可通過dma_map_sg()的反函數dma_unmap_sg()去除DMA映射:

        void dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, enum dma_data_direction direction); SG映射屬于流式DMA映射,與單一緩沖區情況下流式DMA映射類似,如果設備驅動一定要訪問映射情況下的SG緩沖區,應該先調用如下函數:

        int dma_sync_sg_for_cpu(struct device *dev,struct scatterlist *sg, int nents,enum dma_data_direction direction);

        訪問完后,通過下列函數將所有權返回給設備:

        int dma_map_device(struct device *dev,struct scatterlist *sg, int nents,enum dma_data_direction direction);

        Linux 系統中可以有一個相對簡單的方法預先分配緩沖區,那就是同步mem=參數預留內存。例如,對于內存為64MB的系統,通過給其傳遞mem=62MB命令行參數可以使得頂部的2MB內存被預留出來作為IO內存使用,這2MB內存可以被靜態映射,也可以執行ioremap()。

        相應的函數都介紹完了:說真的,好費勁啊,我都想放棄了,可為了小王,我繼續哈在設備驅動中如何操作呢:

        像使用中斷一樣,在使用DMA之前,設備驅動程序需要首先向系統申請DMA通道,申請DMA通道的函數如下:

        int request_dma(unsigned int dmanr, const char * device_id); 同樣的,設備結構體指針可作為傳入device_id的最佳參數。

        使用完DMA通道后,應該使用如下函數釋放該通道:void free_dma(unsinged int dmanr);

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 下一頁

        關鍵詞: cache dma linux

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 安吉县| 九龙坡区| 谢通门县| 五河县| 通渭县| 绥德县| 嘉义市| 明水县| 泊头市| 河北区| 柞水县| 兖州市| 武邑县| 乐都县| 高密市| 贵州省| 怀远县| 北海市| 娄烦县| 伊川县| 时尚| 漠河县| 临泽县| 突泉县| 齐齐哈尔市| 乌审旗| 汶上县| 莱西市| 卢湾区| 柳河县| 新绛县| 吉林市| 中宁县| 乌什县| 常宁市| 林甸县| 天津市| 拉萨市| 临湘市| 竹北市| 周宁县|