一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Exynos4412 ADC 設(shè)備驅(qū)動(dòng)開發(fā)

 昵稱49905388 2017-11-21

       具體ADC硬件知識(shí)及裸機(jī)驅(qū)動(dòng)請(qǐng)看: Exynos4412裸機(jī)開發(fā) —— A/D轉(zhuǎn)換器

1、原理圖如下:


2、相關(guān)寄存器信息

ADC_BASE      0x126C0000
ADCCON        0x0000               1<<0 | 1<<14 | 0X1<<16 | 0XFF<<6
ADCDLY          0x0008               
ADCDAT         0x000C              &0XFFF
CLRINTADC    0x0018
ADCMUX        0x001C

3、大體驅(qū)動(dòng)編寫流程如下

read()
{
       1、向adc設(shè)備發(fā)送要讀取的命令
          ADCCON    1<<0 | 1<<14 | 0X1<<16 | 0XFF<<6

       2、讀取不到數(shù)據(jù)就休眠
            wait_event_interruptible();

       3、等待被喚醒讀數(shù)據(jù)
          havedata = 0;
}

adc_handler()
{
       1、清中斷 ADC使用中斷來通知轉(zhuǎn)換數(shù)據(jù)完畢的
       2、狀態(tài)位置位;
            havedata=1;

       3、喚醒阻塞進(jìn)程
            wake_up()
}

probe()
{
      1、 讀取中斷號(hào),注冊(cè)中斷處理函數(shù)

      2、讀取寄存器的地址,ioremap

      3、字符設(shè)備的操作
}

4、設(shè)備樹中的節(jié)點(diǎn)編寫

  1. fs4412-adc{  
  2.     compatible = "fs4412,adc";  
  3.     reg = <0x126C0000 0x20>;  
  4.     interrupt-parent = <&combiner>;  
  5.     interrupts = <10 3>;  
  6. };  

5、驅(qū)動(dòng)編寫

driver.c

  1. #include <linux/module.h>  
  2. #include <linux/device.h>  
  3. #include <linux/platform_device.h>  
  4. #include <linux/interrupt.h>  
  5. #include <linux/fs.h>  
  6. #include <linux/wait.h>  
  7. #include <linux/sched.h>  
  8. #include <asm/uaccess.h>  
  9. #include <asm/io.h>  
  10. static int major = 250;  
  11.   
  12.   
  13. static wait_queue_head_t wq;  
  14. static int have_data = 0;  
  15. static int adc;  
  16. static struct resource *res1;  
  17. static struct resource *res2;  
  18. static void *adc_base;  
  19.   
  20. #define ADCCON 0x0000     
  21. #define ADCDLY 0x0008                 
  22. #define ADCDAT 0x000C                
  23. #define CLRINTADC 0x0018  
  24. #define ADCMUX 0x001C  
  25.   
  26.   
  27. static  irqreturn_t adc_handler(int irqno, void *dev)  
  28. {  
  29.     have_data = 1;  
  30.   
  31.     printk("11111\n");  
  32.     /*清中斷*/  
  33.     writel(0x12,adc_base + CLRINTADC);  
  34.     wake_up_interruptible(&wq);  
  35.     return IRQ_HANDLED;  
  36. }  
  37. static int adc_open (struct inode *inod, struct file *filep)  
  38. {  
  39.   
  40.     return 0;  
  41. }  
  42. static ssize_t adc_read(struct file *filep, char __user *buf, size_t len, loff_t *pos)  
  43. {  
  44.     writel(0x3,adc_base + ADCMUX);  
  45.     writel(1<<0 | 1<<14 | 0X1<<16 | 0XFF<<6 ,adc_base +ADCCON );  
  46.   
  47.     wait_event_interruptible(wq, have_data==1);  
  48.   
  49.     /*read data*/  
  50.     adc = readl(adc_base+ADCDAT)&0xfff;  
  51.       
  52.     if(copy_to_user(buf,&adc,sizeof(int)))  
  53.     {  
  54.         return -EFAULT;  
  55.     }  
  56.     have_data = 0;  
  57.     return len;  
  58. }  
  59. static  int adc_release(struct inode *inode, struct file *filep)  
  60. {  
  61.     return 0;  
  62. }  
  63. static struct file_operations  adc_ops =  
  64. {  
  65.     .open = adc_open,  
  66.     .release = adc_release,  
  67.     .read = adc_read,  
  68. };  
  69.   
  70.   
  71. static int hello_probe(struct platform_device *pdev)  
  72. {  
  73.     int ret;  
  74.     printk("match 0k \n");  
  75.   
  76.     res1 = platform_get_resource(pdev,IORESOURCE_IRQ, 0);  
  77.     res2 = platform_get_resource(pdev,IORESOURCE_MEM, 0);   
  78.          
  79.     ret = request_irq(res1->start,adc_handler,IRQF_DISABLED,"adc1",NULL);  
  80.       adc_base = ioremap(res2->start,res2->end-res2->start);  
  81.   
  82.     register_chrdev( major, "adc", &adc_ops);  
  83.     init_waitqueue_head(&wq);  
  84.       
  85.     return 0;  
  86. }  
  87. static int hello_remove(struct platform_device *pdev)  
  88. {  
  89.     free_irq(res1->start,NULL);  
  90.     free_irq(res2->start,NULL);    
  91.     unregister_chrdev( major, "adc");  
  92.     return 0;  
  93. }  
  94.   
  95. static struct of_device_id adc_id[]=  
  96. {  
  97.     {.compatible = "fs4412,adc" },  
  98. };  
  99.   
  100. static struct platform_driver hello_driver=  
  101. {  
  102.       
  103.     .probe = hello_probe,  
  104.     .remove = hello_remove,  
  105.     .driver ={  
  106.         .name = "bigbang",  
  107.         .of_match_table = adc_id,  
  108.     },  
  109. };  
  110.   
  111. static int hello_init(void)  
  112. {  
  113.     printk("hello_init");  
  114.     return platform_driver_register(&hello_driver);  
  115. }  
  116. static void hello_exit(void)  
  117. {  
  118.     platform_driver_unregister(&hello_driver);  
  119.     printk("hello_exit \n");  
  120.     return;  
  121. }  
  122. MODULE_LICENSE("GPL");  
  123. module_init(hello_init);  
  124. module_exit(hello_exit);  

test.c

  1. #include <sys/types.h>  
  2. #include <sys/stat.h>  
  3. #include <fcntl.h>  
  4. #include <stdio.h>  
  5.   
  6.   
  7. main()  
  8. {  
  9.     int fd,len;  
  10.     int adc;  
  11.     fd = open("/dev/hello",O_RDWR);  
  12.     if(fd<0)  
  13.     {  
  14.         perror("open fail \n");  
  15.         return ;  
  16.     }  
  17.   
  18.     while(1)  
  19.     {  
  20.         read(fd,&adc,4);  
  21.         printf("adc%0.2f V \n",(1.8*adc)/4096);  
  22.     }  
  23.   
  24.     close(fd);  
  25. }  


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    男人和女人黄 色大片| 人妻内射精品一区二区| 国产一级二级三级观看| 成人亚洲国产精品一区不卡| 日韩一区中文免费视频| 国产又粗又猛又长又黄视频| 免费特黄欧美亚洲黄片| 国产精品视频第一第二区| 美国欧洲日本韩国二本道| 精品久久综合日本欧美| 91欧美日韩中在线视频| 欧美黑人暴力猛交精品| 好吊妞视频只有这里有精品| 欧美美女视频在线免费看| 青青操日老女人的穴穴| 亚洲午夜福利视频在线| 亚洲欧美日韩国产成人| 我想看亚洲一级黄色录像| 亚洲欧美日本视频一区二区| 国产成人av在线免播放观看av | 久久精品国产99精品亚洲| 亚洲欧美日本成人在线| 国产精品一区二区三区激情| 狠狠亚洲丁香综合久久| 亚洲欧美精品伊人久久| 白白操白白在线免费观看 | 午夜福利黄片免费观看| 九九热最新视频免费观看| 国产在线一区二区免费| 欧美一级特黄大片做受大屁股| 欧美一区二区三区性视频| 麻豆精品视频一二三区| 永久福利盒子日韩日韩| 亚洲国产一区精品一区二区三区色| 91欧美激情在线视频| 欧美丰满人妻少妇精品| 欧洲自拍偷拍一区二区| 国产一区二区三区草莓av| 一区二区三区亚洲天堂| 精品久久av一二三区| 日本二区三区在线播放|