一个在PC上注册的led类打印设备及操作方法/*leds_w380.c*/#include#include#include#include#include#include#include#include/**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("<7>w380leds_on\n");break;caseLED_FULL://s3c_gpio_setpin(S5PV210_GPJ3(4),1);printk("<7>w380leds_on\n");break;default:caseLED_OFF://s3c_gpio_setpin(S5PV210_GPJ3(4),0);printk("<7>w380leds_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("<7>w380leds_probe\n");ret=led_classdev_register(&pdev->dev,&w380_blueled);if(ret)gotoerr_blue;printk("<7>w380leds_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("<7>w380leds_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("<7>w380leds_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("<7>w380leds_init\n");printk("<0>w380leds_init\n");intret;ret=platform_driver_register(&w380leds_driver);if(!ret){printk("<7>platform_device_register\n");ret=platform_device_register(&w380leds_device);if(ret){printk("<7>platform_driver_unregister\n");platform_driver_unregister(&w380leds_driver);}}returnret;}staticvoid__exitw380leds_exit(void){printk("<7>w380leds_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*/#include#include#include//#include//#include#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||argc>2){printf("Usage:Ledon|off!\n");exit(1);}//判断输入的参数if(strcmp(argv[1],"on")==0){turn=255;printf("<0>Usage:Ledon!\n");}elseif(strcmp(argv[1],"off")==0){turn=0;printf("<0>Usage:Ledoff!\n");}else{printf("<0>Usage:Ledon|off!\n");exit(1);}write_int(DEVNAME,turn);return0;}进入ledtest目录,编译生成ledtest,执行./ledteston执行dmesg查看结果: