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

📄 iic_xf-s4240.c

📁 自己为XF-S4240语音合成芯片所写的驱动程序
💻 C
字号:
/*		IIC_XF-S4240.c	 xf-s4240 driver made by StevenZ 		080620*/#include<linux/config.h>#include<linux/init.h>#include<linux/module.h>#include<linux/kernel.h>#include<linux/fs.h>#include<linux/poll.h> /*copy_from/to_user()*/#include<asm/hardware.h>#include "iic_xf.h"#define DEVICE "IIC_XF_S4240"#define MAX_BUF 1024#define XF_S4240_ADDR 0x80 //iic_xf4240 address#define X_ADDR 0#define XF_S4240_IICCON (IICCON_ACKEN|IICCON_CLK512|IICCON_INTR|IICCON_CLKPRE(0x3))                                                                   int major=0;int minor=0;int IIC_XF_S4240_open(struct inode *,struct file *);int IIC_XF_S4240_release(struct inode *,struct file *);ssize_t IIC_XF_S4240_read(struct file *,char *,size_t,loff_t *);ssize_t IIC_XF_S4240_write(struct file *,const char *,size_t,loff_t *);//unsigned int IIC_XF_S4240_poll(struct file*,poll_table *);static struct file_operations fops={	owner: 	THIS_MODULE,	read:	IIC_XF_S4240_read,	write:	IIC_XF_S4240_write,	open:	IIC_XF_S4240_open,	release:	IIC_XF_S4240_release,	//poll:	IIC_XF_S4240_poll,};#ifdef CONFIG_DEVFS_FSstatic devfs_handle_t devfs_xf_s4240_reg;#endifstruct IIC_XF_S4240_dev{	char buffer[MAX_BUF];	//int size;	//int index;};struct IIC_XF_S4240_dev my_dev;static int __init IIC_XF_S4240_init(void){	int ret;	int oldiiccon;		//初始化IIC	IIC_init();	Set_IIC_mode(XF_S4240_IICCON, &oldiiccon);	ret=IIC_Read(XF_S4240_ADDR, X_ADDR);	//restore IICCON	Set_IIC_mode(oldiiccon, NULL);	printk(KERN_DEBUG"XF_S4240 system ack 0x%x\n", ret); //会传0x4a表示初始化正确(复位后)	//注册设备	ret=register_chrdev(major,DEVICE,&fops);	if(ret<0)	{	  printk(KERN_DEBUG"register major number failed!\n");	  return ret;	}	else major=ret;	printk(KERN_DEBUG"register major number %d ok!\n",major);		#ifdef CONFIG_DEVFS_FS	devfs_xf_s4240_reg=devfs_register(NULL,"xf-s4240",DEVFS_FL_DEFAULT,				major,minor,S_IFCHR|S_IRUSR|S_IWUSR,&fops,NULL);	#endif	//初始化设备变量	//my_dev.size=0;	//my_dev.index=0;		printk(KERN_DEBUG DEVICE "initialized\n");	return 0;//成功初始化回0}static void __exit IIC_XF_S4240_exit(void){	#ifdef CONFIG_DEVFS_FS	devfs_unregister(devfs_xf_s4240_reg);	#endif	unregister_chrdev(major,DEVICE);	printk(KERN_DEBUG"unregister device ok!\n");}int IIC_XF_S4240_open(struct inode *inode,struct file *file){	MOD_INC_USE_COUNT;	printk(KERN_DEBUG DEVICE " opened!\n");	return 0;	}int IIC_XF_S4240_release(struct inode *inode,struct file *file){	MOD_DEC_USE_COUNT;	printk(KERN_DEBUG DEVICE "closed!\n");		return 0;}ssize_t IIC_XF_S4240_write(struct file *file,const char *buf,size_t count,loff_t *f_pos){ 	int oldiiccon;	printk(KERN_DEBUG"begin to write !\n"); 	if(count>MAX_BUF)		count=MAX_BUF; 	if(copy_from_user(my_dev.buffer,buf,count))		return -EFAULT;	Set_IIC_mode(XF_S4240_IICCON, &oldiiccon);	IIC_WriteSerial(XF_S4240_ADDR,X_ADDR,my_dev.buffer,count);	Set_IIC_mode(oldiiccon, NULL);		return count;}ssize_t IIC_XF_S4240_read(struct file *file,char *buf,size_t count,loff_t *f_pos){			int oldiiccon;	printk(KERN_DEBUG"begin to read !\n");	Set_IIC_mode(XF_S4240_IICCON, &oldiiccon);	IIC_ReadSerial(XF_S4240_ADDR,X_ADDR,my_dev.buffer,count);	Set_IIC_mode(oldiiccon, NULL);		if(copy_to_user(buf,my_dev.buffer,count))		return -EFAULT;	return sizeof(my_dev.buffer);}module_init(IIC_XF_S4240_init);module_exit(IIC_XF_S4240_exit);MODULE_LICENSE("GPL");

⌨️ 快捷键说明

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