add dam mem to mem copy
authorroot <root@huangds-desktop.(none)>
Wed, 26 Jan 2011 07:59:48 +0000 (15:59 +0800)
committerroot <root@huangds-desktop.(none)>
Wed, 26 Jan 2011 07:59:48 +0000 (15:59 +0800)
arch/arm/mach-rk29/Memcpy_Dma.c [new file with mode: 0755]

diff --git a/arch/arm/mach-rk29/Memcpy_Dma.c b/arch/arm/mach-rk29/Memcpy_Dma.c
new file mode 100755 (executable)
index 0000000..6cd496b
--- /dev/null
@@ -0,0 +1,123 @@
+#include <linux/module.h>\r
+#include <linux/dma-mapping.h>\r
+#include <linux/platform_device.h>\r
+#include <linux/irq.h>\r
+#include <linux/io.h>\r
+#include <linux/wait.h>\r
+#include <linux/sched.h>\r
+\r
+#include <mach/rk29_iomap.h>\r
+#include <mach/rk29-dma-pl330.h>\r
+#include <asm/uaccess.h>\r
+#include <asm/current.h>\r
+\r
+\r
+static DECLARE_WAIT_QUEUE_HEAD(wq);\r
+static int wq_condition = 0;\r
+\r
+static struct rk29_dma_client rk29_dma_Memcpy_client = {\r
+        .name = "rk29-dma-memcpy",\r
+};\r
+\r
+\r
+struct Dma_MemToMem {\r
+       int SrcAddr;\r
+       int DstAddr;\r
+       int MenSize;\r
+};\r
+\r
+\r
+static void rk29_dma_memcpy_callback(struct rk29_dma_chan *dma_ch, void *buf_id, int size, enum rk29_dma_buffresult result)\r
+{\r
+    wq_condition = 1;\r
+       wake_up_interruptible(&wq);\r
+}\r
+\r
+//int slecount = 0;\r
+static ssize_t Memcpy_Dma_read(struct device *device,struct device_attribute *attr, void *argv)\r
+{\r
+\r
+     return 0;\r
+}\r
+\r
+static ssize_t Memcpy_Dma_write (struct device *device,struct device_attribute *attr, void *argv)//(struct device_driver *device, const char *argv,size_t count)\r
+{\r
+    int dma_flag;\r
+    u32 mcode_sbus;\r
+    u32 mcode_dbus;\r
+    int i;\r
+    int rt;\r
+    long usec1 = 0;\r
+    // long usec2 = 0;\r
+\r
+    struct Dma_MemToMem  *DmaMemInfo = (struct Dma_MemToMem *)argv;\r
+\r
+\r
+    dma_flag = rk29_dma_request(DMACH_DMAC0_MemToMem, &rk29_dma_Memcpy_client, NULL);           \r
+    dma_flag = DMACH_DMAC0_MemToMem;\r
+\r
+    rt = rk29_dma_devconfig(dma_flag, RK29_DMASRC_MEMTOMEM, DmaMemInfo->SrcAddr);\r
+    rt = rk29_dma_config(dma_flag, 8);\r
+    rt = rk29_dma_set_buffdone_fn(dma_flag, rk29_dma_memcpy_callback);\r
+    rt = rk29_dma_enqueue(dma_flag, NULL, DmaMemInfo->DstAddr, DmaMemInfo->MenSize);\r
+    rt = rk29_dma_ctrl(dma_flag, RK29_DMAOP_START);    \r
+    wait_event_interruptible_timeout(wq, wq_condition, HZ/20);\r
+    wq_condition = 0; \r
+    return 0;\r
+}\r
+\r
+static DRIVER_ATTR(DmaMemcpy,  S_IRUGO|S_IALLUGO, Memcpy_Dma_read, Memcpy_Dma_write);\r
+\r
+\r
+static int __init dma_memcpy_probe(struct platform_device *pdev)\r
+{\r
+    int ret;\r
+      \r
+    ret = device_create_file(&pdev->dev, &driver_attr_DmaMemcpy);\r
+    if(ret)\r
+    {\r
+        printk(">> fb1 dsp win0 info device_create_file err\n");\r
+        ret = -EINVAL;\r
+    }\r
+   // printk(">>>>>>>>>>>>>>>>>>>>> dam_test_probe ok>>>>>>>>>>>>>>>>>>>>>>>>");        \r
+    return 0;\r
+}\r
+\r
+static int  dma_memcpy_remove(struct platform_device *pdev)\r
+{\r
+    int ret;\r
+    driver_remove_file(&pdev->dev, &driver_attr_DmaMemcpy);\r
+  \r
+    return 0;\r
+}\r
+\r
+static struct platform_driver dma_mempcy_driver = {\r
+        .driver = {\r
+                .name   = "dma_memcpy",\r
+                .owner  = THIS_MODULE,                \r
+        },\r
+        .probe          = dma_memcpy_probe,\r
+        .remove         = dma_memcpy_remove,\r
+};\r
+\r
+\r
+static int __init dma_test_init(void)\r
+{\r
+        return platform_driver_register(&dma_mempcy_driver);\r
+}\r
+\r
+static void __exit dma_test_exit(void)\r
+{\r
+        platform_driver_unregister(&dma_mempcy_driver);\r
+}\r
+\r
+module_init(dma_test_init);\r
+module_exit(dma_test_exit);\r
+\r
+MODULE_DESCRIPTION("RK29 PL330 Dma Test Deiver");\r
+MODULE_LICENSE("GPL V2");\r
+MODULE_AUTHOR("ZhenFu Fang <fzf@rock-chips.com>");\r
+\r
+\r
+\r
+\r