?? dadrv.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 + -