📄 s3c2410-da-max504.c
字号:
/* * s3c2410-da-max504.c * * da driver for UP-NETARM2410 AD/DA/CAN MOUDLE BOARD * * Author: ZOU jian guo <zounix@126.com> * Date : $Date: 2004/09/27 10:25:00 $ * * $Revision: 0.1.0 $ * * Based on s3c2410-ts.c * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of this archive * for more details. * * History: * * */#include <linux/config.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/kdev_t.h>#include <linux/sched.h>#include <linux/delay.h>#include <linux/poll.h>#include <linux/spinlock.h>#include <linux/irq.h>#include <linux/delay.h>#include <asm/hardware.h>#include <asm/arch/spi.h>/* debug macros */#undef DEBUG//#define DEBUG#ifdef DEBUG#define DPRINTK( x... ) printk("s3c2410-da-max504: " ##x)#else#define DPRINTK( x... )#endif#define DEVICE_NAME "s3c2410-da"static int Major = 0;static int Minor = 0;#define DA0_CS (1 <<6) //GPE6#define DA1_CS (1 <<7) //GPE7#define DA_CLR (1 <<5) //GPE5#define PORTE_PIN_OUT 0x255400//(GPIO_MODE_OUT | GPIO_PULLUP_DIS | GPIO_E5 | GPIO_E6 | GPIO_E7 | GPIO_E8)#define GPIO_DA0_CS (GPIO_MODE_OUT | GPIO_PULLUP_EN | GPIO_E6)#define GPIO_DA1_CS (GPIO_MODE_OUT | GPIO_PULLUP_EN | GPIO_E7)#define GPIO_DA_CLS (GPIO_MODE_OUT | GPIO_PULLUP_EN | GPIO_E5)#define da0_enable() do {GPEDAT &= ~DA0_CS;udelay(1000);}while(0);#define da0_disable() do {GPEDAT |= DA0_CS;}while(0);#define da1_enable() do {GPEDAT &= ~DA1_CS;udelay(1000);}while(0);#define da1_disable() do {GPEDAT |= DA1_CS;}while(0);#define da_clear() do {GPEDAT &= ~DA_CLR;udelay(1000);GPEDAT |= DA_CLR;}while(0);static int da_open(struct inode *inode, struct file *filp);static int da_release(struct inode *inode, struct file *filp);static void setSPImode (void){ /* prescaler =33 0-255*/ Set_SIO_mode(0, SPCON_SMOD_POLL | SPCON_ENSCK | SPCON_MSTR |SPCON_CPOL_HIGH | SPCON_CPHA_FMTA, 40, 2, NULL, NULL, NULL);}static ssize_t da0_write(struct file *file, const char *buffer, size_t count, loff_t * ppos){ unsigned int value; char buf[4]; da1_disable(); copy_from_user(buf, buffer, 4); value = *((int *)buf); value <<= 2; da_clear();// da1_disable(); da0_enable(); SPISend ((value>>8) & 0xff, 0); SPISend ((value&0xff), 0); da0_disable(); //#ifdef DEBUG printk("write to max504-0 => %u\n",value); //#endif return 0;}static ssize_t da1_write(struct file *file, const char *buffer, size_t count, loff_t * ppos){ unsigned int value; char buf[4]; copy_from_user(buf, buffer, 4); value = *((int *)buf); value <<= 2;// da0_disable(); da_clear(); da1_enable(); SPISend ((value>>8) &0xff, 0); SPISend ((value&0xff), 0);// udelay(100); da1_disable(); //#ifdef DEBUG printk("write to max504-1 => %u\n",value); //#endif return 0;}static unsigned int da0_poll(struct file *filp, struct poll_table_struct *wait){// poll_wait(filp, &(tsdev.wq), wait); return 0;}static unsigned int da1_poll(struct file *filp, struct poll_table_struct *wait){// poll_wait(filp, &(tsdev.wq), wait); return 0;}static ssize_t da0_read(struct file *filp, char *buffer, size_t count, loff_t *ppos){ printk("call da0_read\n disable da1 \n"); da1_disable(); return 0;}static ssize_t da1_read(struct file *filp, char *buffer, size_t count, loff_t *ppos){ printk("call da1_read \n"); da0_disable(); return 0;}static struct file_operations s3c2410_da0_fops = { owner: THIS_MODULE, open: da_open, release: da_release, read: da0_read, write: da0_write, poll: da0_poll,};static struct file_operations s3c2410_da1_fops = { owner: THIS_MODULE, open: da_open, release: da_release, read: da1_read, write: da1_write, poll: da1_poll,};static int da_open(struct inode *inode, struct file *filp){ int minor ; MOD_INC_USE_COUNT; minor = MINOR(inode->i_rdev); printk("minor= %d\n",minor);#if 0 if(minor == 0){ DPRINTK( "da0 opened\n"); filp->f_op = s3c2410_da0_fops; return 0; } if(minor == 1){ DPRINTK( "da1 opened\n"); filp->f_op = s3c2410_da1_fops; return 0; }#endif return 0;}static int da_release(struct inode *inode, struct file *filp){ MOD_DEC_USE_COUNT; return 0;}#ifdef CONFIG_DEVFS_FSstatic devfs_handle_t devfs_da_dir, devfs_da0,devfs_da1;#endifstatic int __init s3c2410_da_init(void){ int ret; set_gpio_ctrl(GPIO_DA0_CS); set_gpio_ctrl(GPIO_DA1_CS); //set port E GPE5,6,7,8 PIN ->out //GPECON |= PORTE_PIN_OUT; SPI_initIO(0); setSPImode(); //auto get major number ret = register_chrdev(0, DEVICE_NAME, &s3c2410_da0_fops); if (ret < 0) { printk(DEVICE_NAME " can't get major number\n"); return ret; } Major = ret;#ifdef CONFIG_DEVFS_FS devfs_da_dir = devfs_mk_dir(NULL, "da", NULL); devfs_da0 = devfs_register(devfs_da_dir, "0", DEVFS_FL_DEFAULT, Major, 0, S_IFCHR | S_IRUSR | S_IWUSR, &s3c2410_da0_fops, NULL); devfs_da1 = devfs_register(devfs_da_dir, "1", DEVFS_FL_DEFAULT, Major, 1, S_IFCHR | S_IRUSR | S_IWUSR, &s3c2410_da1_fops, NULL);#endif printk (DEVICE_NAME"\tinitialized\n");#ifdef DEBUG da_open(NULL, NULL);#endif return 0;}static void __exit s3c2410_da_exit(void){#ifdef CONFIG_DEVFS_FS devfs_unregister(devfs_da0); devfs_unregister(devfs_da1); devfs_unregister(devfs_da_dir);#endif unregister_chrdev(Major, DEVICE_NAME);}module_init(s3c2410_da_init);module_exit(s3c2410_da_exit);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -