龙芯技术社区
直播中

jf_67024233

1年用户 257经验值
擅长:电源/新能源 模拟技术 测量仪表 接口/总线/驱动
私信 关注
[资料]

【龙芯2K0300蜂鸟板试用】龙芯2K0300蜂鸟开发板上GPIO的驱动及使用

收到龙芯2K0300蜂鸟开发板已经有几周了,今天给各位朋友介绍一下这块开发板GPIO的驱动及使用。
先简单介绍一下这块龙芯2K0300蜂鸟开发板,广东龙芯2K0300蜂鸟开发板采用核心板加扩展板的模式设计,核心板上集成了CPU 、DDR4 、PHY芯片、EMMC、NOR FLASH等核心部件;在底板设计上为用户扩展了丰富的外围接口,比如LCD显示屏、3路SPI接口、4路PWM接口、4路CAN接口、8路AD模拟输入接口、4路I2C接口、1路I2S接口、4路UART接口、SD卡座、网口、USB接口等等。满足工控互联网行业所需的接口要求,相关的工作参数满足低功耗设计要求,并能灵活实现系统集成设计,功能扩展等,可广泛应用于电力、交通、医疗、金融、通信、能源、信息家电和物联网等领域。
wKgZomZv9ryAZwC6AAVnO3tNNkE794 (1).jpg

7.jpg

下面通过一个具体的例子——LED灯的控制,来说明龙芯2K0300的GPIO如何使用。

2.jpg

龙芯2K0300的GPIO(General Purpose Input/Output,通用输入输出)使用涉及多个步骤,包括配置设备树、编写驱动程序以及在用户空间进行交互。

一、设备树配置
在龙芯2K0300平台上,GPIO的使用首先需要在设备树(Device Tree)中进行配置。设备树是一种数据结构,用于描述硬件设备的信息,内核在启动时读取这些信息来配置硬件。

步骤:

打开龙芯2K0300的设备树文件,通常位于arch/loongarch/boot/dts/loongson/目录下,文件名可能类似于loongson_2k0300_pai_99.dts。
找到与GPIO相关的节点,并根据需要配置GPIO引脚的功能。例如,如果要将某个GPIO引脚配置为LED的控制引脚,需要确保该引脚没有被其他设备占用。
注释掉或修改可能冲突的设备节点,如I2C等,以避免引脚冲突。
编译设备树文件,并将编译后的设备树镜像(.dtb文件)复制到开发板的启动分区中。

二、驱动程序编写
编写驱动程序是控制GPIO的关键步骤。驱动程序负责初始化GPIO引脚、设置引脚方向(输入或输出)以及读写引脚状态。

示例代码(LED驱动):

#include <linux/module.h>
#include <linux/init.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>

#define GPIO_LED 83  // 假设LED连接的GPIO引脚号为83
#define LED_NAME "led"

static int led_gpio;

static int led_open(struct inode *inode, struct file *filp) {
    return 0;
}

static ssize_t led_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) {
    unsigned char data;
    if (copy_from_user(&data, buf, 1))
        return -EFAULT;

    if (data == 1)
        gpio_set_value(led_gpio, 0);  // 点亮LED(假设低电平点亮)
    else
        gpio_set_value(led_gpio, 1);  // 熄灭LED

    return count;
}

static struct file_operations led_fops = {
    .owner = THIS_MODULE,
    .open = led_open,
    .write = led_write,
};

static int __init led_init(void) {
    int ret;

    led_gpio = GPIO_LED;
    ret = gpio_request(led_gpio, LED_NAME);
    if (ret) {
        printk(KERN_ERR "Failed to request GPIO for LED\n");
        return ret;
    }

    ret = gpio_direction_output(led_gpio, 1);  // 初始化为输出模式,并熄灭LED
    if (ret) {
        printk(KERN_ERR "Failed to set GPIO direction for LED\n");
        gpio_free(led_gpio);
        return ret;
    }

    // 省略注册字符设备等其他代码...

    return 0;
}

static void __exit led_exit(void) {
    gpio_free(led_gpio);
    // 省略注销字符设备等其他代码...
}

module_init(led_init);
module_exit(led_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("LED Driver for Loongson 2K0300");

说明:
上述代码是一个简化的LED驱动程序示例,它包含了基本的GPIO操作函数,如gpio_request、gpio_direction_output和gpio_set_value。
在led_init函数中,首先请求GPIO引脚,然后将其设置为输出模式,并初始化为熄灭状态。
在led_write函数中,根据用户空间写入的数据来控制LED的亮灭。

1.jpg

编译和运行:

编译LED驱动程序并将其加载到内核中(这通常涉及到将模块编译为.ko文件,并使用insmod或modprobe命令加载它)。

编译用户空间程序(例如,将其保存为led_control.c,并使用gcc -o led_control led_control.c命令编译)。

确保LED设备文件(/dev/led)存在,或者在你的驱动程序中注册一个设备,并在设备树中正确配置GPIO引脚。

运行用户空间程序,如 ./led_control on 来点亮LED,或 ./led_control off 来熄灭LED。

更多回帖

发帖
×
20
完善资料,
赚取积分