当前位置:首页 > 技术 > 正文内容

Linux LED设备驱动开发实践

访客 技术 2026年6月6日 1

LED驱动硬件访问机制

Linux设备驱动通过配置硬件寄存器实现控制。现代处理器采用MMU(内存管理单元)实现虚拟地址到物理地址的映射,提供内存保护和访问权限控制。32位系统虚拟地址空间为4GB,物理内存(如1GB DDR3)通过MMU映射到该空间。

地址映射示意图

地址映射函数

// 物理地址到虚拟地址映射
void __iomem *phy_to_virt(resource_size_t phys_addr, size_t region_size)
{
    return __arch_ioremap(phys_addr, region_size, MT_DEVICE);
}

// 映射释放
void unmap_region(volatile void __iomem *virt_addr);

寄存器访问接口

// 读操作
uint8_t  reg_read8(const volatile void __iomem *addr);
uint16_t reg_read16(const volatile void __iomem *addr);
uint32_t reg_read32(const volatile void __iomem *addr);

// 写操作
void reg_write8(uint8_t value, volatile void __iomem *addr);
void reg_write16(uint16_t value, volatile void __iomem *addr);
void reg_write32(uint32_t value, volatile void __iomem *addr);

LED硬件连接原理

LED0连接至GPIOI_0引脚,低电平点亮。需配置GPIOI_MODER为输出模式,通过GPIOI_BSRR寄存器控制电平状态。

LED电路原理图

驱动程序实现

#include <linux/io.h>
#include <linux/module.h>

#define DEV_MAJOR 202
#define DEV_NAME "led_ctrl"

enum led_state { LED_OFF, LED_ON };

/* 物理地址定义 */
#define GPIOI_BASE_ADDR 0x5000A000
#define GPIOI_MODER_OFFSET 0x00
#define GPIOI_BSRR_OFFSET 0x18

/* 虚拟地址指针 */
static void __iomem *vmoder_reg;
static void __iomem *vbsrr_reg;

void set_led(enum led_state state)
{
    if (state == LED_ON)
        reg_write32(1 << 16, vbsrr_reg); // 设置高16位使输出低电平
    else
        reg_write32(1, vbsrr_reg); // 设置低16位使输出高电平
}

static int dev_open(struct inode *inodep, struct file *filep)
{
    return 0;
}

static ssize_t dev_write(struct file *filep, const char __user *buf, 
                        size_t len, loff_t *offset)
{
    char val;
    if (copy_from_user(&val, buf, 1))
        return -EFAULT;
    
    set_led(val ? LED_ON : LED_OFF);
    return len;
}

static struct file_operations fops = {
    .open = dev_open,
    .write = dev_write,
};

static int __init driver_init(void)
{
    vmoder_reg = phy_to_virt(GPIOI_BASE_ADDR + GPIOI_MODER_OFFSET, 4);
    vbsrr_reg = phy_to_virt(GPIOI_BASE_ADDR + GPIOI_BSRR_OFFSET, 4);
    
    // 配置GPIO为输出模式
    reg_write32((reg_read32(vmoder_reg) & ~0x3) | 0x1, vmoder_reg);
    
    // 注册字符设备
    register_chrdev(DEV_MAJOR, DEV_NAME, &fops);
    return 0;
}

static void __exit driver_exit(void)
{
    unmap_region(vmoder_reg);
    unmap_region(vbsrr_reg);
    unregister_chrdev(DEV_MAJOR, DEV_NAME);
}

module_init(driver_init);
module_exit(driver_exit);
MODULE_LICENSE("GPL");

用户空间测试程序

#include <fcntl.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    int fd = open(argv[1], O_WRONLY);
    char state = atoi(argv[2]);
    write(fd, &state, 1);
    close(fd);
    return 0;
}

编译与测试流程

1. 驱动编译Makefile:

obj-m := led_drv.o
KERNEL_DIR := /path/to/kernel

all:
    make -C $(KERNEL_DIR) M=$(PWD) modules

2. 测试程序编译:

arm-linux-gnueabihf-gcc led_test.c -o ledtest

3. 加载驱动并测试:

# insmod led_drv.ko
# mknod /dev/ledctrl c 202 0
# ./ledtest /dev/ledctrl 1  # LED亮
# ./ledtest /dev/ledctrl 0  # LED灭
编译结果 驱动加载状态

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。