From 69cd3e21b3420a543e2cb43d94bf8c540616a071 Mon Sep 17 00:00:00 2001 From: D301_Ubuntu <1395769145@qq.com> Date: Wed, 12 Jun 2024 17:20:55 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E6=A0=91=E4=B8=8B?= =?UTF-8?q?=E7=9A=84platform=E5=AE=9E=E9=AA=8C=E5=8F=98=E5=BC=82=E5=AE=8C?= =?UTF-8?q?=E6=88=90=EF=BC=8C=E7=AD=89=E5=BE=85=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: D301_Ubuntu <1395769145@qq.com> --- 18_dtsplatform/.vscode/c_cpp_properties.json | 51 ++++++ 18_dtsplatform/.vscode/settings.json | 21 +++ 18_dtsplatform/Makefile | 13 ++ 18_dtsplatform/dtsplatform.code-workspace | 41 +++++ 18_dtsplatform/ledApp.c | 46 +++++ 18_dtsplatform/leddevice.c | 112 ++++++++++++ 18_dtsplatform/leddriver.c | 169 +++++++++++++++++++ 7 files changed, 453 insertions(+) create mode 100644 18_dtsplatform/.vscode/c_cpp_properties.json create mode 100644 18_dtsplatform/.vscode/settings.json create mode 100644 18_dtsplatform/Makefile create mode 100644 18_dtsplatform/dtsplatform.code-workspace create mode 100644 18_dtsplatform/ledApp.c create mode 100644 18_dtsplatform/leddevice.c create mode 100644 18_dtsplatform/leddriver.c diff --git a/18_dtsplatform/.vscode/c_cpp_properties.json b/18_dtsplatform/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..8b7002d --- /dev/null +++ b/18_dtsplatform/.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": [ + "${workspaceFolder}", + "../../../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/18_dtsplatform/.vscode/settings.json b/18_dtsplatform/.vscode/settings.json new file mode 100644 index 0000000..1a2a04a --- /dev/null +++ b/18_dtsplatform/.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/18_dtsplatform/Makefile b/18_dtsplatform/Makefile new file mode 100644 index 0000000..895dfb1 --- /dev/null +++ b/18_dtsplatform/Makefile @@ -0,0 +1,13 @@ +KERNELDIR := ../../../linux-imx-rel_imx_4.1.15_2.1.0_ga +CURRENT_PATH := $(shell pwd) +obj-m := leddriver.o + +build: kernel_modules + +kernel_modules: + $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules + +clean: + $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean + + diff --git a/18_dtsplatform/dtsplatform.code-workspace b/18_dtsplatform/dtsplatform.code-workspace new file mode 100644 index 0000000..a563c85 --- /dev/null +++ b/18_dtsplatform/dtsplatform.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/18_dtsplatform/ledApp.c b/18_dtsplatform/ledApp.c new file mode 100644 index 0000000..05b1adc --- /dev/null +++ b/18_dtsplatform/ledApp.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; +} diff --git a/18_dtsplatform/leddevice.c b/18_dtsplatform/leddevice.c new file mode 100644 index 0000000..9e3091f --- /dev/null +++ b/18_dtsplatform/leddevice.c @@ -0,0 +1,112 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* +* 寄存器地址定义 +*/ +#define CCM_CCGR1_BASE (0X020C406C) +#define SW_MUX_GPIO1_IO03_BASE (0X020E0068) +#define SW_PAD_GPIO1_IO03_BASE (0X020E02F4) +#define GPIO1_DR_BASE (0X0209C000) +#define GPIO1_GDIR_BASE (0X0209C004) +#define REGISTER_LENGTH 4 + +/* + @description : 释放 flatform 设备模块的时候此函数会执行 +* @param - dev : 要释放的设备 + +* @return 无 +*/ +static void led_release(struct device *dev) +{ + printk("led device released!\r\n"); +} + +static struct resource led_resources[] = { + [0] = { + .start = CCM_CCGR1_BASE, + .end = (CCM_CCGR1_BASE + REGISTER_LENGTH - 1), + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = SW_MUX_GPIO1_IO03_BASE, + .end = (SW_MUX_GPIO1_IO03_BASE + REGISTER_LENGTH - 1), + .flags = IORESOURCE_MEM, + }, + [2] = { + .start = SW_PAD_GPIO1_IO03_BASE, + .end = (SW_PAD_GPIO1_IO03_BASE + REGISTER_LENGTH - 1), + .flags = IORESOURCE_MEM, + }, + [3] = { + .start = GPIO1_DR_BASE, + .end = (GPIO1_DR_BASE + REGISTER_LENGTH - 1), + .flags = IORESOURCE_MEM, + }, + [4] = { + .start = GPIO1_GDIR_BASE, + .end = (GPIO1_GDIR_BASE + REGISTER_LENGTH - 1), + .flags = IORESOURCE_MEM, + }, +}; + + + +/* +* platform 设备结构体 +*/ + static struct platform_device leddevice = { + .name = "imx6ul-led", + .id = -1, + .dev = { + .release = &led_release, + }, + .num_resources = ARRAY_SIZE(led_resources), + .resource = led_resources, +}; + + +/* +* @description: 设备模块加载 +* @param : 无 +* @return : 无 +*/ +static int __init leddevice_init(void) +{ + return platform_device_register(&leddevice); +} + +/* +* @description : 设备模块注销 +* @param : 无 +* @return : 无 +*/ +static void __exit leddevice_exit(void) +{ + platform_device_unregister(&leddevice); +} + +module_init(leddevice_init); +module_exit(leddevice_exit); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("chaoliang"); \ No newline at end of file diff --git a/18_dtsplatform/leddriver.c b/18_dtsplatform/leddriver.c new file mode 100644 index 0000000..a56a265 --- /dev/null +++ b/18_dtsplatform/leddriver.c @@ -0,0 +1,169 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define LEDDEV_CNT 1 /* 设备号长度 */ +#define LEDDEV_NAME "dtsplatled" /* 设备名字 */ +#define LEDOFF 0 +#define LEDON 1 + +/* leddev设备结构体 */ +struct leddev_dev +{ + dev_t devid; /* 设备号 */ + struct cdev cdev; + struct class *class; + struct device *device; /* 设备 */ + int major; /* 主设备号 */ + 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 led_fops = { + .owner = THIS_MODULE, + .open = led_open, + .write = led_write, +}; + + +static int led_probe(struct platform_device *dev) +{ + printk("led driver and device was matched!\r\n"); + /* 1、设置设备号 */ + if(leddev.major){ + leddev.devid = MKDEV(leddev.major, 0); + register_chrdev_region(leddev.devid, LEDDEV_CNT, LEDDEV_NAME); + }else{ + alloc_chrdev_region(&leddev.devid, 0, LEDDEV_CNT, LEDDEV_NAME); + leddev.major = MAJOR(leddev.devid); + } + + /* 2、注册设备 */ + cdev_init(&leddev.cdev, &led_fops); + cdev_add(&leddev.cdev, leddev.devid, LEDDEV_CNT); + + /* 创建类 */ + leddev.class = class_create(THIS_MODULE, LEDDEV_NAME); + if (IS_ERR(leddev.class)) + { + return PTR_ERR(leddev.class); + } + + /* 4、创建设备 */ + 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); /* 设置为输出,默认高电平 */ + return 0; +} + + +static int led_remove(struct platform_device* dev) +{ + gpio_set_value(leddev.led0, 1); + cdev_del(&leddev.cdev); + unregister_chrdev_region(leddev.devid, LEDDEV_CNT); + device_destroy(leddev.class, leddev.devid); + class_destroy(leddev.class); + return 0; +} + +static struct of_device_id led_of_match[] = { + {.compatible = "atkalpha-gpioled"}, + {/* 空 */} +}; + +static struct platform_driver led_driver = { + .driver = { + .name = "imx6ul-led", + .of_match_table = led_of_match, + }, + .probe = led_probe, + .remove = led_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 -- Gitee From 5caac345444664446eef4f0eb0899e0fb9b7bf97 Mon Sep 17 00:00:00 2001 From: sushe_Ubuntu Date: Wed, 12 Jun 2024 22:18:10 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9D301=E4=B8=8B=E7=BC=96?= =?UTF-8?q?=E5=86=99=E7=9A=84=E7=A8=8B=E5=BA=8F=EF=BC=8C=E5=B9=B6=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sushe_Ubuntu --- 18_dtsplatform/leddriver.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/18_dtsplatform/leddriver.c b/18_dtsplatform/leddriver.c index a56a265..f4fb2f7 100644 --- a/18_dtsplatform/leddriver.c +++ b/18_dtsplatform/leddriver.c @@ -29,10 +29,11 @@ struct leddev_dev { dev_t devid; /* 设备号 */ + int major; /* 主设备号 */ struct cdev cdev; struct class *class; struct device *device; /* 设备 */ - int major; /* 主设备号 */ + struct device_node *node; /* LED设备节点 */ int led0; /* LED灯GPIO标号 */ }; @@ -113,6 +114,14 @@ static int led_probe(struct platform_device *dev) } /* 4、创建设备 */ + leddev.device = device_create(leddev.class, NULL, leddev.devid, NULL, + LEDDEV_NAME); + if (IS_ERR(leddev.device)) + { + return PTR_ERR(leddev.device); + } + + /* 5、初始化IO */ leddev.node = of_find_node_by_path("/gpioled"); if (leddev.node == NULL) { printk("gpioled node nost find!\r\n"); -- Gitee