收到龙芯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](//file1.elecfans.com/web2/M00/EF/30/wKgZomZv9ryAZwC6AAVnO3tNNkE794.jpg)
![7.jpg](//file1.elecfans.com/web2/M00/05/71/wKgZombZpCeAbwYVAE7SaCsw5oU560.jpg)
下面通过一个具体的例子——LED灯的控制,来说明龙芯2K0300的GPIO如何使用。
![2.jpg](//file1.elecfans.com/web2/M00/05/71/wKgZombZpKSASUDhAE54LRDxqj4597.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
#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);
else
gpio_set_value(led_gpio, 1);
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);
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](//file1.elecfans.com/web2/M00/06/5A/wKgaombZpWaADOpAAFoMFB0d-BU329.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。