news 2026/1/31 12:29:08

Rk3588鲁班猫4点亮led

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Rk3588鲁班猫4点亮led

Rk3588鲁班猫4点亮led

这里只上代码,先执行sudo sh -c 'echo 0 > /sys/class/leds/sys_status_led/brightness'关闭自带一直闪烁的led。

随后编译下面代码得到.ko文件并加载到板卡。Makefile文件可以看我上一篇博客的末尾。

#include <linux/init.h> #include <linux/module.h> #include <linux/cdev.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #define DEV_NAME "led_chrdev" #define DEV_CNT (1) #define GPIO4_BASE (0xFEC50000) #define GPIO4_DR_L (GPIO4_BASE + 0x0000) #define GPIO4_DDR_L (GPIO4_BASE + 0x0008) static dev_t devno; struct class *led_chrdev_class; struct led_chrdev { struct cdev dev; unsigned int __iomem *va_dr; // 数据寄存器,设置输出的电压 unsigned int __iomem *va_ddr; // 数据方向寄存器,设置输入或者输出 unsigned int led_pin; // 偏移 }; static int led_chrdev_open(struct inode *inode, struct file *filp) { unsigned int val = 0; struct led_chrdev *led_cdev = (struct led_chrdev *)container_of(inode->i_cdev, struct led_chrdev,dev); filp->private_data = container_of(inode->i_cdev, struct led_chrdev, dev); printk("open\n"); //设置输出模式 val = ioread32(led_cdev->va_ddr); val |= ((unsigned int)0x1 << (led_cdev->led_pin+16)); val |= ((unsigned int)0X1 << (led_cdev->led_pin)); iowrite32(val,led_cdev->va_ddr); //输出高电平 val = ioread32(led_cdev->va_dr); val |= ((unsigned int)0x1 << (led_cdev->led_pin+16)); val |= ((unsigned int)0x1 << (led_cdev->led_pin)); iowrite32(val, led_cdev->va_dr); return 0; } static int led_chrdev_release(struct inode *inode, struct file *filp) { return 0; } static ssize_t led_chrdev_write(struct file *filp, const char __user * buf, size_t count, loff_t * ppos) { unsigned long val = 0; unsigned long copy_ret=0; char ret = 0; struct led_chrdev *led_cdev = (struct led_chrdev *)filp->private_data; printk("write \n"); copy_ret=copy_from_user(&ret, buf, 1); if (copy_ret != 0) { printk(KERN_ERR "led_chrdev: copy_from_user failed, uncopied: %lu\n", copy_ret); return -EFAULT; // 返回错误码,告知用户空间读取失败 } val = ioread32(led_cdev->va_dr); printk("val = %lx\n", val); if (ret == '0'){ val |= ((unsigned int)0x1 << (led_cdev->led_pin+16)); val &= ~((unsigned int)0x01 << (led_cdev->led_pin)); /*设置GPIO引脚输出低电平*/ } else{ val |= ((unsigned int)0x1 << (led_cdev->led_pin+16)); val |= ((unsigned int)0x01 << (led_cdev->led_pin)); /*设置GPIO引脚输出高电平*/ } iowrite32(val, led_cdev->va_dr); printk("val = %lx\n", val); return count; } static struct file_operations led_chrdev_fops = { .owner = THIS_MODULE, .open = led_chrdev_open, .release = led_chrdev_release, .write = led_chrdev_write, }; static struct led_chrdev led_cdev[DEV_CNT] = { {.led_pin = 13}, }; static __init int led_chrdev_init(void) { int i = 0; dev_t cur_dev; printk("led_chrdev init (lubancat2 GPIO4_B5)\n"); led_cdev[0].va_dr = ioremap(GPIO4_DR_L, 4); led_cdev[0].va_ddr = ioremap(GPIO4_DDR_L, 4); alloc_chrdev_region(&devno, 0, DEV_CNT, DEV_NAME); led_chrdev_class = class_create(THIS_MODULE, "led_chrdev"); for (; i < DEV_CNT; i++) { cdev_init(&led_cdev[i].dev, &led_chrdev_fops); led_cdev[i].dev.owner = THIS_MODULE; cur_dev = MKDEV(MAJOR(devno), MINOR(devno) + i); cdev_add(&led_cdev[i].dev, cur_dev, 1); device_create(led_chrdev_class, NULL, cur_dev, NULL, DEV_NAME "%d", i); } return 0; } module_init(led_chrdev_init); static __exit void led_chrdev_exit(void) { int i; dev_t cur_dev; printk("led chrdev exit (lubancat2 GPIO4_B5)\n"); for (i = 0; i < DEV_CNT; i++) { iounmap(led_cdev[i].va_dr); // 释放模式寄存器虚拟地址 iounmap(led_cdev[i].va_ddr); // 释放输出类型寄存器虚拟地址 } for (i = 0; i < DEV_CNT; i++) { cur_dev = MKDEV(MAJOR(devno), MINOR(devno) + i); device_destroy(led_chrdev_class, cur_dev); cdev_del(&led_cdev[i].dev); } class_destroy(led_chrdev_class); unregister_chrdev_region(devno, DEV_CNT); } module_exit(led_chrdev_exit); MODULE_AUTHOR("embedfire"); MODULE_LICENSE("GPL");

之后执行下面语句就可以看到板卡的led点亮和关闭了。

#绿灯亮 sudo sh -c 'echo 0 >/dev/led_chrdev0' #绿灯灭 sudo sh -c 'echo 1 >/dev/led_chrdev0'
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/26 8:57:30

Netcode for GameObjects Boss Room 多人RPG战斗(1)

L1_项目介绍 概述 Boss Room是一个使用Unity Netcode for GameObjects制作的完整合作多人RPG游戏样本。它展示了典型的多人游戏网络编码模式&#xff0c;旨在帮助开发者学习如何构建类似的多人游戏。 核心特点 支持最多8名玩家合作游戏集成Unity Gaming Services&#xff0…

作者头像 李华
网站建设 2026/1/30 3:39:44

基于显微镜图像的体液细胞分类与异常检测:改进RetinaNet模型实现

1. 基于显微镜图像的体液细胞分类与异常检测&#xff1a;改进RetinaNet模型实现 在医疗诊断领域&#xff0c;体液细胞分析是许多疾病诊断的重要环节。然而&#xff0c;传统的显微镜细胞分析依赖专业医师的经验&#xff0c;耗时且容易受主观因素影响。随着深度学习技术的发展&a…

作者头像 李华
网站建设 2026/1/30 2:01:09

基于YOLO11-C3k2-JDPM的车牌识别系统优化与实现

1. 基于YOLO11-C3k2-JDPM的车牌识别系统优化与实现 车牌识别技术作为智能交通系统的核心组成部分&#xff0c;在停车场管理、违章检测和城市安防等领域有着广泛应用。本文将详细介绍基于YOLO11-C3k2-JDPM的车牌识别系统的优化与实现过程&#xff0c;从算法原理到实际应用&…

作者头像 李华
网站建设 2026/1/27 6:44:14

LobeChat物流跟踪信息查询集成教程

LobeChat物流跟踪信息查询集成教程 在电商与物流高度融合的今天&#xff0c;用户对包裹状态的实时掌握需求愈发迫切。传统的查询方式往往需要打开多个平台、复制粘贴单号、手动点击查询&#xff0c;流程繁琐且体验割裂。而随着大语言模型&#xff08;LLM&#xff09;和自然语言…

作者头像 李华
网站建设 2026/1/29 9:07:32

基于单片机的交通红绿灯控制系统

基于单片机的交通红绿灯控制系统设计与实现 第一章 绪论 在城市交通管理中&#xff0c;红绿灯是维持路口秩序的核心设备。传统交通红绿灯多采用固定时序控制&#xff0c;难以应对行人横穿、交通流量波动等场景&#xff0c;存在通行效率低、行人安全保障不足等问题。单片机凭借…

作者头像 李华