📄 tlc2543.c
字号:
#include <linux/module.h>#include <linux/moduleparam.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/init.h>//#include <asm/delay.h>#include <linux/types.h>#include <asm/io.h>#include <linux/ioctl.h>#include <linux/fcntl.h>/* O_ACCMODE */#include <linux/cdev.h>#include <asm/uaccess.h>#include <linux/config.h>#include <linux/mm.h>#include <linux/errno.h>#include <asm/segment.h>#include <asm/hardware.h>#include <asm/arch/regs-gpio.h>MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("Qlc");int AD_MAJOR = 0;#define AD_NAME "tlc2543"#define CS_AD S3C2410_GPF4#define CLK_AD S3C2410_GPF5#define INDATA_AD S3C2410_GPF6#define OUTDATA_AD S3C2410_GPF0//#define EOC_AD S3C2410_GPF8#define CS_AD_CONFIG S3C2410_GPF4_OUTP#define CLK_AD_CONFIG S3C2410_GPF5_OUTP#define INDATA_AD_CONFIG S3C2410_GPF6_OUTP#define OUTDATA_AD_CONFIG S3C2410_GPF0_INP//#define EOC_AD_CONFIG S3C2410_GPF8_INP#define AD_IOC_MAGIC 'k'#define CS_ON _IO(AD_IOC_MAGIC,0)#define CS_OFF _IO(AD_IOC_MAGIC,1)#define CLK_ON _IO(AD_IOC_MAGIC,2)#define CLK_OFF _IO(AD_IOC_MAGIC,3)#define INDATA_ON _IO(AD_IOC_MAGIC,4)#define INDATA_OFF _IO(AD_IOC_MAGIC,5)static unsigned char key=0;struct cdev cdev;int ad_open (struct inode *inode,struct file *filp){ //printk("open\n"); s3c2410_gpio_cfgpin(CS_AD,CS_AD_CONFIG); s3c2410_gpio_cfgpin(CLK_AD,CLK_AD_CONFIG); s3c2410_gpio_cfgpin(INDATA_AD,INDATA_AD_CONFIG); s3c2410_gpio_cfgpin(OUTDATA_AD,OUTDATA_AD_CONFIG); s3c2410_gpio_setpin(CS_AD,1); return 0;}int ad_read(struct file *fp,char * buf, size_t size,loff_t * offt){ key=s3c2410_gpio_getpin(OUTDATA_AD); put_user(key,buf); return (int)key;}int ad_release (struct inode *inode,struct file *filp){ s3c2410_gpio_setpin(CS_AD,1); printk("release\n"); return 0;}static int ad_ioctl(struct inode *inode,struct file *file, unsigned int cmd, unsigned long arg){ switch( cmd){ case CS_ON: {s3c2410_gpio_setpin(CS_AD,1); break; } case CS_OFF: {s3c2410_gpio_setpin(CS_AD,0); break; } case CLK_ON: {s3c2410_gpio_setpin(CLK_AD,1); break; } case CLK_OFF: {s3c2410_gpio_setpin(CS_AD,0); break; } case INDATA_ON: {s3c2410_gpio_setpin(INDATA_AD,1); break; } case INDATA_OFF: {s3c2410_gpio_setpin(INDATA_AD,0); break; } default: { break; } } return 0;}struct file_operations ad_fops ={ .owner = THIS_MODULE, .open = ad_open, .read = ad_read, .ioctl = ad_ioctl, .release = ad_release,}; //don't forget ";" static int __init ad_init(void){ int result,err,devno; dev_t dev = MKDEV(AD_MAJOR,0); printk("initing\n"); if(AD_MAJOR) result = register_chrdev_region(dev,1,AD_NAME); else { result = alloc_chrdev_region(&dev,0,1,AD_NAME); AD_MAJOR=MAJOR(dev); } if(result<0){ printk(KERN_WARNING "tlc2543: unable to get major %d\n",AD_MAJOR); return result; } devno=MKDEV(AD_MAJOR,0); cdev_init(&cdev, &ad_fops); cdev.owner= THIS_MODULE; cdev.ops=&ad_fops; err=cdev_add(&cdev,devno,1); if(err) printk(KERN_NOTICE "err adding tlc2543\n"); printk("tlc2543 device installed\n"); return 0;}static void __exit ad_exit(void){ cdev_del(&cdev); unregister_chrdev_region(MKDEV(AD_MAJOR,0),1); printk("tlc2543 device uninstalled\n");}module_init(ad_init);module_exit(ad_exit);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -