📄 复件 led.c
字号:
/**************************************************************//* name : /linux/drivers/led/led.c *//* description: board-EDUKIT-II/III *//* copyright : version 1.0 *//* cpu : S3C44B0X *//* author : HaiTao Guo *//* company : South China University *//* date : Sunday,Octorber 05,2008 *//**************************************************************/#include<linux/module.h>#include<linux/init.h>#include<linux/sched.h>#include<linux/kernel.h>#include<linux/fs.h>#include<linux/errno.h>#include<linux/types.h>#include<linux/types.h>#include<asm-arm/uaccess.h>#include<asm-arm/s3c44b0x.h>#undef DEBUG#ifdef DEBUG#define TRACE(str,args...) printk("led: ",str,##args)#else#define TRACE(str,args...)#endif#define LED_MAJOR 60 #define LED_DEVNAME "led0"#define GPB_MASK (3<<4)#define GPF_MASK (3<<3)#define GET_DATA(b,f) ((u8)( ((~b&0x20)>>5) | ((~b&0x10)>>2) | ((~b&0x08)>>2) | ((~b&0x10)>>1) )#define SET_DATA(t,b,f) (b=( ((~t&0x01)<<5) | ((~t&0x04)<<2)), f=(((~t&0x02)<<2) | ((~t&0x08)<<1)) )#define LED_LOCK(u) down(&u->lock)#define LED_UNLOCK(u) up(&u->lock)/*led control unit*/struct unit{ struct semaphore lock; u32 *PCONB; u32 *PDATB; u32 *PCONF; u32 *PDATF; u32 *PUPF; u32 b; u32 f;};static char *version="Embest EDUKIT-II led driver version 1.0(2008-10-05)<www.edmbedinfo.com>\n";static struct unit led_unit={ .PCONB=(u32 *)S3C44B0X_PCONB, .PDATB=(u32 *)S3C44B0X_PDATB, .PCONF=(u32 *)S3C44B0X_PCONF, .PDATF=(u32 *)S3C44B0X_PDATF, .PUPF =(u32 *)S3C44B0X_PUPF,};static void led_set_value(struct unit *unit,u8 val){ u32 temp; SET_DATA(val,unit->b,unit->f); temp=*unit->PDATB; temp&=~GPB_MASK; temp|=unit->b; *unit->PDATB=temp; temp=*unit->PDATF; temp&=~GPF_MASK; temp|=unit->f; *unit->PDATF=temp;}static u8 led_get_value(struct unit *unit){ u8 temp=GET_DATA(unit->b,unit->f); return temp;}static int led_open(struct inode *inode, struct file *file){ TRACE("open\n"); file->private_data=&led_unit; MOD_INC_USE_COUNT; return 0;}static int led_release(struct inode *inode,struct file *file){ TRACE("release\n"); MOD_DEC_USE_COUNT; return 0;}static ssize_t led_read(struct file *file,char *buf,size_t count,loff_t *offset){ u8 temp; int ret; struct unit *unit=(struct unit *)file->private_data; TRACE("read\n"); if(count>1) count=1; LED_LOCK(unit); ret=copy_to_user(buf,&temp,count)?-EFAULT:count; LED_UNLOCK(unit); return ret;}static ssize_t led_write(struct file *file,const char *buf,size_t count,loff_t *offset){ u8 temp; int ret; struct unit *unit=(struct unit *)file->private_data; TRACE("write\n"); if(count>1) count=1; LED_LOCK(unit); ret=copy_from_user(&temp,buf,count)?-EFAULT:count; if(ret) led_set_value(unit,temp); LED_UNLOCK(unit); return ret;}static struct file_operations led_file_operations={ owner:THIS_MODULE, open :led_open, release:led_release, read:led_read, write:led_write,};static void __init led_init(struct unit *unit){ u32 temp; /*init device lock*/ init_MUTEX(&unit->lock); /*init io port*/ temp=*unit->PCONB; temp&=~(3<<4); *unit->PCONB=temp; temp=*unit->PCONF; temp&=~((3<<8)~(3<<6)); temp|=((1<<8)|(1<<6)); *unit->PCONF=temp; temp=*unit->PUPF; temp|=(3<<3); *unit->PUPF=temp; /*init data and turn on led*/ led_set_value(unit,0x0f); mdelay(100); led_set_value(unit,0x00);}/*module init functions */int __init led_init_module(void){ int res; TRACE("init_module\n"); /*print version information*/ printk(KERN_INFO "%s",version); /*register device*/ res=register_chrdev(LED_MAJOR,LED_DEVNAME,&led_file_operations); if(res<0){ printk("ekii-led.o:unable to get major %d for led device. \n",LED_MAJOR); return res; } /*then call led_init()*/ led_init(&led_unit); return 0;}/*module exit functions*/void __exit led_cleanup(void){ int res; TRACE("cleanup\n"); res=unregister_chrdev(LED_MAJOR,LED_DEVNAME); if(res<0) printk("ekii-led.o:unable to release major %d for led device.\n",LED_MAJOR);}module_init(led_init_module);module_exit(led_cleanup);MODULE_DESCRIPTION("EDUKIT-II led driver");MODULE_AUTHOR("Embest tech&info Co.,Ltd.<www.embedinfo.com>");MODULE_LICENSE("GPL");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -