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

📄 s3c2410-da-max504.c

📁 运行在s3c2410开发实验源代码
💻 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 + -