⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dadrv.c

📁 at91rm9200 AD/DA转换驱动 很好的驱动开发范例
💻 C
字号:
/* DA convert driver for H9200M and H9200T board    Author: Wei An   E-Mail: an.wei@mail.ia.ac.cn/weian@hyesco.com   Date:   2005/6/1*/#ifdef MODULE#include <linux/module.h>#include <linux/version.h>#else#endif#define __KERNEL__#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/sched.h>#include <linux/fs.h>#include <linux/mm.h>#include <linux/poll.h>#include <linux/slab.h>#include <linux/ioport.h>#include <asm/uaccess.h>#include <asm/io.h>#include <linux/fcntl.h>#include <asm/arch/AT91RM9200_SYS.h>#define DA_PHYSICAL_REG_SIZE   ((unsigned int)  0x00000004)//PHY addressd def#define AT91_nDACCS0_ADDR      ((unsigned int) 	0x80000000)#define AT91_nDACCS1_ADDR      ((unsigned int) 	0x80000010)//global variables defvolatile unsigned int * nDACCS0_ADDR;volatile unsigned int * nDACCS1_ADDR;volatile unsigned int * nDACCS_ADDR;//local variables defstatic int DA_write(struct file *,const char *,int,loff_t *);static struct file_operations da_fops={      write     :(void(*))DA_write,};char da_name[]="dadrv";static unsigned int major =0;static void Delay (int);/* Configure pio */void AT91_CfgPIO_DA(void){     AT91PS_SYS sys = (AT91PS_SYS) AT91C_VA_BASE_SYS;     // Enable PIOC     sys->PIOC_PDR=(unsigned int)(1<<13);     // Select Peripheral A              sys->PIOC_ASR=(unsigned int)(1<<13);}/* Select channel for anolog voltage input */static int DA_write(struct file *DA_file, const char *buf,int len,loff_t *loff){       int retv;       unsigned char ch;       unsigned int iopdata;       /* obtain channel selection data from user space */       if(len==0x1)        {          if(copy_from_user((char*)&ch,buf,len))          return -EFAULT;          switch(ch)           {                     case '0':              {                nDACCS_ADDR=nDACCS0_ADDR;                      }              break;               case '1':              {                nDACCS_ADDR=nDACCS1_ADDR;                      }              break;         default:             break;                                   }        }      else if(len==0x4)       {        if(copy_from_user((char*)&iopdata,buf,len))               return -EFAULT;               writel(iopdata,nDACCS_ADDR);              Delay(100000);       }      else       {}return len;     }/* * Main initialization routine */static int __init DA_at91_init(void){       int retv;       AT91PS_SYS sys = (AT91PS_SYS) AT91C_VA_BASE_SYS;              sys->EBI_SMC2_CSR[7] =(AT91C_SMC2_NWS & 0xff) | AT91C_SMC2_WSEN \       | (AT91C_SMC2_TDF & 0x300) | AT91C_SMC2_BAT | AT91C_SMC2_DBW_16;       AT91_CfgPIO_DA();       /* map hardware I/O address to virtual memory address */       nDACCS0_ADDR=(unsigned int*)ioremap(AT91_nDACCS0_ADDR,DA_PHYSICAL_REG_SIZE);       nDACCS1_ADDR=(unsigned int*)ioremap(AT91_nDACCS1_ADDR,DA_PHYSICAL_REG_SIZE);       /* register module */       retv=register_chrdev(major,da_name,&da_fops);       if(retv<0)       {         printk("<1>Register Fail!\n");         return retv;       }      if(major==0)        major=retv;      return 0;}/* unregister module */static void __exit DA_at91_cleanup(void){     int retv;      retv=unregister_chrdev(major,da_name);      if(retv<0)      {        printk("<1>UnRegister Fail!\n");        return;      }      printk("<1>ADDRV:GOOD-bye!\n");       }void Delay(int i){	int j,k;	for(j=0;j<i*800;j++)	{	k=0;	}    }module_init(DA_at91_init);module_exit(DA_at91_cleanup);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -