编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第1页 共1页一个在PC上注册的led类打印设备及操作方法/*leds_w380.c*/#include #include #include #include #include #include #include #include /* * Blue led. * (it can only be blue flashing led) */static void w380_blueled_set(struct led_classdev *led_dev, enum led_brightness value){ //s3c_gpio_cfgpin(S5PV210_GPJ3(4), S3C_GPIO_SFN(2)); //s3c_gpio_setpull(S5PV210_GPJ3(4), 0); switch (value) { case LED_HALF: //s3c_gpio_setpin(S5PV210_GPJ3(4), 1); printk("<7>w380leds_on\n"); break; case LED_FULL: //s3c_gpio_setpin(S5PV210_GPJ3(4), 1); printk("<7>w380leds_on\n"); break; default: case LED_OFF: //s3c_gpio_setpin(S5PV210_GPJ3(4), 0); printk("<7>w380leds_off\n"); break; }}/*static ssize_t w380_blue_show(struct device *dev, struct device_attribute *attr, char *buf){ struct led_classdev *bled =container_of(dev,struct led_classdev,dev ); //w380_blueled_set(bled,1); return sprintf(buf, "%u\n", 0); }static ssize_t w380_blue_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){ struct led_classdev *bled =container_of(dev,struct led_classdev,dev ); w380_blueled_set(bled,255); return 0;}static DEVICE_ATTR(blue, 0644, w380_blue_show, w380_blue_store);static struct attribute *w380led_attributes[] = { &dev_attr_blue.attr, NULL};static struct attribute_group w380led_attribute_group = { .attrs = w380led_attributes};static struct led_classdev w380_blueled = { .name = "w380:blue", .brightness_set = w380_blueled_set,};*/ static int w380leds_probe(struct platform_device *pdev){ int ret; printk("<7>w380leds_probe\n"); ret = led_classdev_register(&pdev->dev, &w380_blueled); if (ret) goto err_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,"No source control for LED: %d\n", ret); return 0;err_blue: dev_err(&pdev->dev, "led_classdev_register failed\n"); printk("<7>w380leds_probefailed\n"); led_classdev_unregister(&w380_blueled);}static int w380leds_remove(struct platform_device *pdev){ led_classdev_unregister(&w380_blueled); return 0;}static struct platform_driver w380leds_driver = { .driver = { .name = "w380_leds", .owner = THIS_MODULE, }, .probe = w380leds_probe, .remove = w380leds_remove,};static struct platform_device w380leds_device = { .name = "w380_leds",};static int __init w380leds_init(void){ printk("<7>w380leds_init\n"); printk("<0>w380leds_init\n"); int ret; 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); } } return ret;}static void __exit w380leds_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("wang tao <>");MODULE_DESCRIPTION("LED driver for the w380");MODULE_LICENSE("GPL");MODULE_ALIAS("platform:w380_leds");其Makefile文件如下:注意命令的开头是一个tabifneq ($(KERNELRELEASE),)#kbuild syntax. dependency relationshsip of files and target modules are listed here.mymodule-objs := leds_w380.oobj-m := leds_w380.o elsePWD := $(shell pwd)KVER ?= $(shell uname -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下步骤三:加载sudo modprobe leds_w380 Sudo rmmod leds_w380.ko Sudo insmod leds_w380.ko这样反复的目的是利用modprobe的依赖关系。
步骤四:成功验证,Sudo lsmod以下是测试代码:/*ledtest.c*/#include #include #include //#include //#include #define DEVNAME "/sys/class/leds/w380:blue/brightness"/*需要注意的是这个宏可以针对操作不同的设备而修改*/static int write_int(char const* path, int value){ int fd; static int already_warned = 0; fd = open(path, O_RDWR); if (fd >= 0) { char buffer[20]; int bytes = sprintf(buffer, "%d\n", value); printf("buffer:%s\n", buffer); int amt = write(fd, buffer, bytes); close(fd); return amt == -1 ? 1: 0; } else { if (already_warned == 0。