【驱动篇】龙芯LS2K0300之LED驱动

2024-06-23 16:04
文章标签 led 驱动 龙芯 ls2k0300

本文主要是介绍【驱动篇】龙芯LS2K0300之LED驱动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实验目的

点亮龙芯开发板上面的用户自定义LED灯,编写LED驱动以及测试用例验证实现效果,LED位于开发板左下方(靠近USB口)第二个

在这里插入图片描述

原理图

LED通过电阻上拉至电源P3V3,低电平时LED被点亮

在这里插入图片描述

设备树

打开arch/loongarch/boot/dts/loongson/loongson_2k0300_pai_99.dts,将72-150行的i2c1和i2c2两个节点注释掉,如下所示

在这里插入图片描述

将loongson_2k0300_pai_99设备树编译进内核,编译完后将内核scp到开发板的/boot目录下,然后重启开发板

在这里插入图片描述

驱动示例

LED驱动

LED对应的GPIO号为83

#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>#define GPIOLED_CNT			1		  
#define GPIOLED_NAME		"led"	
#define OFF 				0		
#define ON 					1		
#define GPIO_LED 			83struct my_led_dev{dev_t dev_id;		struct cdev cdev;	struct class *class;	struct device *device;	int major;			int minor;			struct device_node	*nd; int led;		
};struct my_led_dev led_dev;	static int led_open(struct inode *inode, struct file *filp)
{filp->private_data = &led_dev; return 0;
}static ssize_t led_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt)
{return 0;
}static ssize_t led_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt)
{int ret;unsigned char data[1];unsigned char ledstat;struct my_led_dev *dev = filp->private_data;ret = copy_from_user(data, buf, cnt);if(ret < 0) {printk("kernel write failed!\r\n");return -EFAULT;}ledstat = data[0];	if(ledstat == ON) {	gpio_set_value(dev->led, 0);	} else if(ledstat == OFF) {gpio_set_value(dev->led, 1);	}return 0;
}static int led_release(struct inode *inode, struct file *filp)
{return 0;
}static struct file_operations led_dev_fops = {.owner = THIS_MODULE,.open = led_open,.read = led_read,.write = led_write,.release = 	led_release,
};static int __init led_init(void)
{int ret = 0;led_dev.led = GPIO_LED;if(led_dev.led < 0) {printk("can't get led-gpio");return -EINVAL;}ret = gpio_request(led_dev.led, "LED-GPIO");if (ret) {printk(KERN_ERR "led_dev: Failed to request led-gpio\n");return ret;}ret = gpio_direction_output(led_dev.led, 1);if(ret < 0) {printk("can't set gpio!\r\n");}if (led_dev.major) {		led_dev.dev_id = MKDEV(led_dev.major, 0);ret = register_chrdev_region(led_dev.dev_id, GPIOLED_CNT, GPIOLED_NAME);if(ret < 0) {pr_err("cannot register %s char driver [ret=%d]\n", GPIOLED_NAME, GPIOLED_CNT);goto free_gpio;}} else {					ret = alloc_chrdev_region(&led_dev.dev_id, 0, GPIOLED_CNT, GPIOLED_NAME);if(ret < 0) {pr_err("%s Couldn't alloc_chrdev_region, ret=%d\r\n", GPIOLED_NAME, ret);goto free_gpio;}led_dev.major = MAJOR(led_dev.dev_id);	led_dev.minor = MINOR(led_dev.dev_id);	}led_dev.cdev.owner = THIS_MODULE;cdev_init(&led_dev.cdev, &led_dev_fops);cdev_add(&led_dev.cdev, led_dev.dev_id, GPIOLED_CNT);if(ret < 0)goto del_unregister;led_dev.class = class_create(THIS_MODULE, GPIOLED_NAME);if (IS_ERR(led_dev.class)) {goto del_cdev;}led_dev.device = device_create(led_dev.class, NULL, led_dev.dev_id, NULL, GPIOLED_NAME);if (IS_ERR(led_dev.device)) {goto destroy_class;}return 0;destroy_class:class_destroy(led_dev.class);
del_cdev:cdev_del(&led_dev.cdev);
del_unregister:unregister_chrdev_region(led_dev.dev_id, GPIOLED_CNT);
free_gpio:gpio_free(led_dev.led);return -EIO;
}static void __exit led_exit(void)
{cdev_del(&led_dev.cdev);unregister_chrdev_region(led_dev.dev_id, GPIOLED_CNT); device_destroy(led_dev.class, led_dev.dev_id);class_destroy(led_dev.class);gpio_free(led_dev.led); 
}module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");

Makefile

跟之前一篇文章的Makefile差不多,这里要改一下驱动名称

obj-m += led.o 
KDIR:=/home/asensing/loongson/linux-4.19
ARCH=loongarch 
CROSS_COMPILE=loongarch64-linux-gnu-
PWD?=$(shell pwd) 
all:make -C $(KDIR) M=$(PWD) modules 

build脚本

分别编译测试用例和驱动模块

export PATH=$PATH:/home/asensing/loongson/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.3-1/bin
make -j8
loongarch64-linux-gnu-gcc test.c -o test
FILE=$PWD/$(basename $PWD).ko
scp $FILE test root@192.168.137.128:/home/root

测试用例

c代码

#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"
#include "time.h"int main(int argc, char *argv[])
{int fd, ret;char *filename;unsigned char data[1];if(argc != 2){printf("Error Usage!\r\n");return -1;}filename = argv[1];fd = open(filename, O_RDWR);if(fd < 0){printf("file %s open failed!\r\n", argv[1]);return -1;}while(1) {data[0] = 1;ret = write(fd, data, sizeof(data));if(ret < 0){printf("LED Control Failed!\r\n");close(fd);return -1;}usleep(500000);data[0] = 0;ret = write(fd, data, sizeof(data));if(ret < 0){printf("LED Control Failed!\r\n");close(fd);return -1;}usleep(500000);}ret = close(fd);if(ret < 0){printf("file %s close failed!\r\n", argv[1]);return -1;}return 0;
}

① 通过执行上面的build脚本,生成led.ko和test文件

② 插入内核驱动模块led.ko

③ 检查/dev目录是否已经生成设备节点

④ 执行test用例

在这里插入图片描述

命令行

在led.ko没有插入的情况下,也可以用以下脚本循环点亮LED灯

while true; 
do echo 1 > /sys/class/gpio/gpio48/value; sleep 0.5; echo 0 > /sys/class/gpio/gpio48/value; sleep 0.5; 
done;

实验效果

可以看到板子左下角第二颗LED被循环点亮

龙芯LS2K0300之LED驱动

这篇关于【驱动篇】龙芯LS2K0300之LED驱动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087626

相关文章

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

物联网之流水LED灯、正常流水灯、反复流水灯、移动流水灯

MENU 硬件电路设计软件程序设计正常流水LED灯反复流水LED灯移动流水LED灯 硬件电路设计 材料名称数量直插式LED1kΩ电阻杜邦线(跳线)若干面包板1 每一个LED的正极与开发板一个GPIO引脚相连,并串联一个电阻,负极接GND。 当然也可以选择只使用一个电阻。 软件程序设计 正常流水LED灯 因为要用到多个GPIO引脚,所以最好把所有的GPI

什么是LED智能会议一体机?COB超微小间距LED会议一体机大势所趋

LED智能会议一体机,作为现代会议室革新的核心装备,正逐步颠覆传统会议模式的界限。它不仅仅是一台集成了高清显示、触控互动、音视频处理及远程协作等功能于一体的智能设备,更是推动会议效率与体验双重飞跃的关键力量。随着技术的不断进步,特别是COB(Chip On Board)超微小间距LED技术的引入,LED智能会议一体机正迎来前所未有的发展机遇,成为大势所趋。 COB技术通过将LED芯片直接封装在基

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

UMDF驱动安装

VS2013 + WDF8.1,UMDF驱动选择User Mode Driver,不要选User Mode Driver 2.0,否则Win7安装有问题,如图 另外,在驱动安装时不要忘记WUDFUpdate_<主版本号><次版本号>.dll文件,具体文件名在INF中查找。此文件可在WDF的安装目录中找到。注意:在WDF的安装目录中会有3个WUDFUpdate_xxx.dll文件,x86,x6

全倒装COB超微小间距LED显示屏的工艺技术,相比SMD小间距有何优势

全倒装COB(Chip On Board)超微小间距LED显示屏,在工艺技术上的革新,相较于传统的SMD(Surface Mount Device)小间距LED显示屏,展现出了多方面的显著优势。 首先,全倒装技术极大地提升了LED芯片的散热性能。通过将芯片直接焊接在基板上,减少了热阻,使得热量能够更快速地传导至基板并散发出去,有效避免了因高温导致的光衰和色彩偏移问题,从而保证了显示屏的长期稳定性

电脑驱动分类

电脑驱动程序(驱动程序)是操作系统与硬件设备之间的桥梁,用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类: 1. 设备驱动程序 显示驱动程序:控制显卡和显示器的显示功能,负责图形渲染和屏幕显示。 示例:NVIDIA、AMD 显示驱动程序。打印机驱动程序:允许操作系统与打印机通信,控制打印任务。 示例:HP、Canon 打印机驱动程序。声卡驱动程序:管理音频输入和输出,与声卡硬件

龙芯小本debian无线(wifi)连接设置

本人有一台龙芯8089b小本,已被我重装了debian系统。由于学习nodeJs,所以想用它当node服务器; 正准备下载node等时发现命令模式下不能自动连接无线,于是网上找来一篇debian连接wifi的文章, 来源参考http://blog.163.com/wangpeng922@126/blog/static/64133083201211131100539/ 查看网卡信息:#

龙芯小本8089b安装debian7+java+tomcat+mysql

之前团购了一个龙芯小本8089b,cpu很差劲,内存也只有1G,根本不能用来娱乐,于是想把它换个纯字符系统,然后搭建java服务器平台,用作局域网固定的mini服务器开发用。 以下是我搭建过程,当然实际比这做的多,这是多次尝试之后的成功过程,分享给大家,自己也做个笔记 debian7纯字符系统安装龙芯专有java安装tomcat安装mysql安装 一、debian7安装参考 圣域☆