diff --git a/19_miscbeep/.vscode/c_cpp_properties.json b/19_miscbeep/.vscode/c_cpp_properties.json new file mode 100644 index 0000000000000000000000000000000000000000..085818aa6d670b63b71bd7f7ff89cf1e6fae65a7 --- /dev/null +++ b/19_miscbeep/.vscode/c_cpp_properties.json @@ -0,0 +1,51 @@ +{ + "configurations": [ + { + "name": "Linux", + "includePath": [ + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/include", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/generated", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/asm", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/drivers", + "${workspaceFolder}/**", + "${default}" + ], + "defines": ["__KERNEL__","__linux__"], + "compilerPath": "/usr/bin/g++", + "cStandard": "c11", + "cppStandard": "c++17", + "intelliSenseMode": "gcc-x64", + "browse": { + "path": [ + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/include", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/generated", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/asm", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/drivers", + "${workspaceFolder}/**", + "${default}" + ] + } + }, + { + "name": "Win32", + "includePath": [ + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/include", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/generated", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/asm", + "../../../linux-imx-rel_imx_4.1.15_2.1.0_ga/drivers", + "${workspaceFolder}/**", + "${default}" + ], + "defines": ["__KERNEL__","__linux__"], + "compilerPath": "C:/Qt/Qt5.12.9/Tools/mingw730_64/bin/gcc.exe", + "cStandard": "c11", + "cppStandard": "c++17", + "intelliSenseMode": "gcc-x64" + } + ], + "version": 4 +} + diff --git a/19_miscbeep/.vscode/settings.json b/19_miscbeep/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..1a2a04ac7a2d6b080404235adcd34b94bc581cb4 --- /dev/null +++ b/19_miscbeep/.vscode/settings.json @@ -0,0 +1,21 @@ +{ + "search.exclude": { + "**/node_modules": true, + "**/bower_components": true, + "**/*.o":true, + "**/*.su":true, + "**/*.cmd":true, + "Documentation":true, + }, + "files.exclude": { + "**/.git": true, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.DS_Store": true, + "**/*.o":true, + "**/*.su":true, + "**/*.cmd":true, + "Documentation":true, + } +} \ No newline at end of file diff --git a/19_miscbeep/Makefile b/19_miscbeep/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..79d2c777032689659e10b3e42ad58757c5165ab4 --- /dev/null +++ b/19_miscbeep/Makefile @@ -0,0 +1,13 @@ +KERNELDIR := ../../../linux-imx-rel_imx_4.1.15_2.1.0_ga +CURRENT_PATH := $(shell pwd) +obj-m := miscled.o + +build: kernel_modules + +kernel_modules: + $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules + +clean: + $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean + + diff --git a/19_miscbeep/miscbeep.code-workspace b/19_miscbeep/miscbeep.code-workspace new file mode 100644 index 0000000000000000000000000000000000000000..a563c858bedf0385cd9bbd6d0395651af865f705 --- /dev/null +++ b/19_miscbeep/miscbeep.code-workspace @@ -0,0 +1,41 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "files.associations": { + "gpio.h": "c", + "*.tcc": "c", + "ioctl.h": "c", + "fstream": "c", + "types.h": "c", + "kernel.h": "c", + "ide.h": "c", + "uaccess.h": "c", + "atomic.h": "c", + "interrupt.h": "c", + "hardirq.h": "c", + "irq.h": "c", + "delay.h": "c", + "init.h": "c", + "module.h": "c", + "cdev.h": "c", + "of_address.h": "c", + "of_gpio.h": "c", + "errno.h": "c", + "device.h": "c", + "of.h": "c", + "of_irq.h": "c", + "timer.h": "c", + "stdlib.h": "c", + "stdio.h": "c", + "driver.h": "c", + "select.h": "c", + "fcntl.h": "c", + "signal.h": "c" + } + + } +} \ No newline at end of file diff --git a/19_miscbeep/miscled.c b/19_miscbeep/miscled.c new file mode 100644 index 0000000000000000000000000000000000000000..46534955939c094610a8e8cadd4565c4a62661c6 --- /dev/null +++ b/19_miscbeep/miscled.c @@ -0,0 +1,162 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define LEDDEV_MINOR 1 /* 设备号长度 */ +#define LEDDEV_NAME "miscled" /* 设备名字 */ +#define LEDOFF 0 +#define LEDON 1 + +/* leddev设备结构体 */ +struct leddev_dev +{ + dev_t devid; /* 设备号 */ + struct cdev cdev; + struct class *class; + struct device *device; /* 设备 */ + + struct device_node *node; /* LED设备节点 */ + int led0; /* LED灯GPIO标号 */ +}; + +struct leddev_dev leddev; /* led设备 */ + +void led0_switch(u8 sta) +{ + if (sta == LEDON) + { + gpio_set_value(leddev.led0, 0); + }else if (sta == LEDOFF) + { + gpio_set_value(leddev.led0, 1); + } +} + + +static int led_open(struct inode* inode, struct file* filp) +{ + filp->private_data = &leddev; + return 0; +} + +static ssize_t led_write(struct file* filp, const char __user* buf, size_t cnt, loff_t* offt) +{ + int retvalue; + unsigned char databuf[2]; + unsigned char ledstat; + + retvalue = copy_from_user(databuf, buf, cnt); + if (retvalue<0) + { + printk("kernel write failed! \r\n"); + return -EFAULT; + } + ledstat = databuf[0]; + if (ledstat == LEDON) + { + led0_switch(LEDON); + }else if (ledstat == LEDOFF) + { + led0_switch(LEDOFF); + } + return 0; +} + + + +struct file_operations miscled_fops = { + .owner = THIS_MODULE, + .open = led_open, + .write = led_write, +}; + +static struct miscdevice led_miscdev = { + .minor = LEDDEV_MINOR, + .name = LEDDEV_NAME, + .fops = &miscled_fops, +}; + +static int miscled_probe(struct platform_device *dev) +{ + int ret = 0; + printk("led driver and device was matched!\r\n"); + /* 5、初始化IO */ + leddev.node = of_find_node_by_path("/gpioled"); + if (leddev.node == NULL) { + printk("gpioled node nost find!\r\n"); + return -EINVAL; + } + leddev.led0 = of_get_named_gpio(leddev.node, "led-gpio", 0); + if (leddev.led0 < 0) { + printk("can't get led-gpio\r\n"); + return -EINVAL; + } + gpio_request(leddev.led0, "led0"); + gpio_direction_output(leddev.led0, 1); /* 设置为输出,默认高电平 */ + + ret = misc_register(&led_miscdev); + if (ret < 0) + { + printk("misc device register failed!\r\n"); + } + + return 0; +} + + +static int miscled_remove(struct platform_device* dev) +{ + gpio_set_value(leddev.led0, 1); + gpio_free(leddev.led0); + misc_deregister(&led_miscdev); + return 0; +} + +static struct of_device_id miscled_of_match[] = { + {.compatible = "atkalpha-gpioled"}, + {/* 空 */} +}; + +static struct platform_driver led_driver = { + .driver = { + .name = "imx6ul-led", + .of_match_table = miscled_of_match, + }, + .probe = miscled_probe, + .remove = miscled_remove, +}; + +static int __init leddriver_init(void) +{ + return platform_driver_register(&led_driver); +} + +static __exit leddriver_exit(void) +{ + platform_driver_unregister(&led_driver); +} + +module_init(leddriver_init); +module_exit(leddriver_exit); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("chaoliang"); \ No newline at end of file diff --git a/19_miscbeep/miscledApp.c b/19_miscbeep/miscledApp.c new file mode 100644 index 0000000000000000000000000000000000000000..05b1adcc81378cf278a2a8161ba082a9f986b5c6 --- /dev/null +++ b/19_miscbeep/miscledApp.c @@ -0,0 +1,46 @@ +#include "stdio.h" +#include "unistd.h" +#include "sys/types.h" +#include "fcntl.h" +#include "stdlib.h" +#include "string.h" + +#define LEDOFF 0 +#define LEDOON 0 + +int main(int argc,char *argv[]) +{ + int fd, retvalue; + char *filename; + unsigned char databuf[3]; + if (argc != 3) + { + printf("Error Usage!\r\n"); + return -1; + } + + filename = argv[1]; + + /* 打开led驱动 */ + fd = open(filename, O_RDWR); + if(fd < 0){ + printf("file %s open failed!\r\n", argv[1]); + return -1; + } + + databuf[0] = atoi(argv[2]); + retvalue = write(fd, databuf, sizeof(databuf)); + if(retvalue < 0 ){ + printf("LED Control Failed!\r\n"); + close(fd); + return -1; + } + + retvalue = close(fd); + if(retvalue < 0){ + printf("file %s close failed!\r\n", argv[1]); + return -1; + } + + return 0; +}