一个在PC上注册的led类打印设备及操作方法/*leds_w380.c*/#includelinux/init.h#includelinux/module.h#includelinux/platform_device.h#includelinux/err.h#includelinux/string.h#includelinux/ctype.h#includelinux/leds.h#includelinux/Sysfs.h/**Blueled.*(itcanonlybeblueflashingled)*/staticvoidw380_blueled_set(structled_classdev*led_dev,enumled_brightnessvalue){//s3c_gpio_cfgpin(S5PV210_GPJ3(4),S3C_GPIO_SFN(2));//s3c_gpio_setpull(S5PV210_GPJ3(4),0);switch(value){caseLED_HALF://s3c_gpio_setpin(S5PV210_GPJ3(4),1);printk(7w380leds_on\n);break;caseLED_FULL://s3c_gpio_setpin(S5PV210_GPJ3(4),1);printk(7w380leds_on\n);break;default:caseLED_OFF://s3c_gpio_setpin(S5PV210_GPJ3(4),0);printk(7w380leds_off\n);break;}}/*staticssize_tw380_blue_show(structdevice*dev,structdevice_attribute*attr,char*buf){structled_classdev*bled=container_of(dev,structled_classdev,dev);//w380_blueled_set(bled,1);returnsprintf(buf,%u\n,0);}staticssize_tw380_blue_store(structdevice*dev,structdevice_attribute*attr,constchar*buf,size_tcount){structled_classdev*bled=container_of(dev,structled_classdev,dev);w380_blueled_set(bled,255);return0;}staticDEVICE_ATTR(blue,0644,w380_blue_show,w380_blue_store);staticstructattribute*w380led_attributes[]={&dev_attr_blue.attr,NULL};staticstructattribute_groupw380led_attribute_group={.attrs=w380led_attributes};staticstructled_classdevw380_blueled={.name=w380:blue,.brightness_set=w380_blueled_set,};*/staticintw380leds_probe(structplatform_device*pdev){intret;printk(7w380leds_probe\n);ret=led_classdev_register(&pdev-dev,&w380_blueled);if(ret)gotoerr_blue;printk(7w380leds_probe_device_create_file\n);//ret=device_create_file(&pdev-dev,&dev_attr_blue);//ret=sysfs_create_group(&pdev-dev.kobj,&w380led_attribute_group);printk(7w380leds_probe_device_create_fileOOOOO\n);if(ret!=0)dev_err(&pdev-dev,NosourcecontrolforLED:%d\n,ret);return0;err_blue:dev_err(&pdev-dev,led_classdev_registerfailed\n);printk(7w380leds_probefailed\n);led_classdev_unregister(&w380_blueled);}staticintw380leds_remove(structplatform_device*pdev){led_classdev_unregister(&w380_blueled);return0;}staticstructplatform_driverw380leds_driver={.driver={.name=w380_leds,.owner=THIS_MODULE,},.probe=w380leds_probe,.remove=w380leds_remove,};staticstructplatform_devicew380leds_device={.name=w380_leds,};staticint__initw380leds_init(void){printk(7w380leds_init\n);printk(0w380leds_init\n);intret;ret=platform_driver_register(&w380leds_driver);if(!ret){printk(7platform_device_register\n);ret=platform_device_register(&w380leds_device);if(ret){printk(7platform_driver_unregister\n);platform_driver_unregister(&w380leds_driver);}}returnret;}staticvoid__exitw380leds_exit(void){printk(7w380leds_exit\n);platform_device_register(&w380leds_device);platform_driver_unregister(&w380leds_driver);}module_init(w380leds_init);module_exit(w380leds_exit);MODULE_AUTHOR(wangtao);MODULE_DESCRIPTION(LEDdriverforthew380);MODULE_LICENSE(GPL);MODULE_ALIAS(platform:w380_leds);其Makefile文件如下:注意命令的开头是一个tabifneq($(KERNELRELEASE),)#kbuildsyntax.dependencyrelationshsipoffilesandtargetmodulesarelistedhere.mymodule-objs:=leds_w380.oobj-m:=leds_w380.oelsePWD:=$(shellpwd)KVER?=$(shelluname-r)KDIR:=/lib/modules/$(KVER)/buildall:$(MAKE)-C$(KDIR)M=$(PWD)clean:rm-rf.*.cmd*.o*.mod.c*.ko.tmp_versionsendif步骤一:编译,make一下生成leds_w380.o和leds_w380.ko等步骤二:复制,将leds_w380.ko复制到/lib/module/2.6.32-21-generic/kernel/drivers/leds下步骤三:加载sudomodprobeleds_w380Sudormmodleds_w380.koSudoinsmodleds_w380.ko这样反复的目的是利用modprobe的依赖关系。步骤四:成功验证,Sudolsmod以下是测试代码:/*ledtest.c*/#includestdio.h#includestdlib.h#includefcntl.h//#includesys/ioctl.h//#includesys/types.h#defineDEVNAME/sys/class/leds/w380:blue/brightness/*需要注意的是这个宏可以针对操作不同的设备而修改*/staticintwrite_int(charconst*path,intvalue){intfd;staticintalready_warned=0;fd=open(path,O_RDWR);if(fd=0){charbuffer[20];intbytes=sprintf(buffer,%d\n,value);printf(buffer:%s\n,buffer);intamt=write(fd,buffer,bytes);close(fd);returnamt==-1?1:0;}else{if(already_warned==0){printf(write_intfailedtoopen%s\n,path);already_warned=1;}return-1;}}intmain(intargc,char**argv){intturn;//检测命令后面带的参数if(argc==1||argc2){printf(Usage:Ledon|off!\n);exit(1);}//判断输入的参数if(strcmp(argv[1],on)==0){turn=255;printf(0Usage:Ledon!\n);}elseif(strcmp(argv[1],off)==0){turn=0;printf(0Usage:Ledoff!\n);}else{printf(0Usage:Ledon|off!\n);exit(1);}write_int(DEVNAME,turn);return0;}进入ledtest目录,编译生成ledtest,执行./ledteston执行dmesg查看结果: