📄 iic_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 + -