【驱动篇】龙芯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驱动

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/32510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【职场人】如何与同事有效沟通

在职场中&#xff0c;沟通如同桥梁&#xff0c;连接着每一位职场人士的心灵与智慧。有效的沟通不仅能让工作更加顺畅&#xff0c;还能让团队关系更加和谐。那么&#xff0c;如何与同事进行有效沟通呢&#xff1f;下面&#xff0c;我将结合个人经验和一些幽默的比喻&#xff0c;…

音频数据集1--LJSpeech单人语音

LJ Speech Dataset 版本号: 1.1 , 文件大小: 2.6GB 1.简介 1. 1 内容简介 LJS是一个语音数据集&#xff0c;包含 13,100 个音频片段&#xff0c;内容为Linda Johnson(欧美女性)朗读的 7 本书籍段落(非小说类)。每个片段都提供文本转录&#xff0c;片段长度从 1 到 10 秒不等&…

八大排序之希尔排序

一、概念及其介绍 希尔排序(Shell Sort)是插入排序的一种&#xff0c;它是针对直接插入排序算法的改进。 希尔排序又称缩小增量排序&#xff0c;因 DL.Shell 于 1959 年提出而得名。 它通过比较相距一定间隔的元素来进行&#xff0c;各趟比较所用的距离随着算法的进行而减小…

什么是微分和导数?

文章目录 设立问题微分特性指数特性线性特性常数特性 多项式微分导数 在机器学习领域&#xff0c;有多种解决最优化问题的方法&#xff0c;其中之一就是使用微分。 通过微分&#xff0c;可以得知函数在某个点的斜率&#xff0c;也可以了解函数在瞬间的变化。 设立问题 请想象一…

Tortoise 删除文件

1、右击需要删除的文件&#xff0c;选择Delete 2、提交

【查看显卡信息】——Ubuntu和windows

1、VMware虚拟机 VMware虚拟机上不能使用CUDA/CUDNN&#xff0c;也安装不了显卡驱动 查看显卡信息&#xff1a; lspci | grep -i vga 不会显示显卡信息&#xff0c;只会输出VMware SVGA II Adapter&#xff0c;表示这是一个虚拟机&#xff0c;无法安装和使用显卡驱动 使用上…

GitHub 标星 6

美国网友对这个大全给予了很高的评价&#xff1a;这份清单中列出的开源软件&#xff0c;不仅解决了硅谷大厂前员工的难处&#xff0c;也能为其他所有码农解除困惑。 在这套大全的指导下&#xff0c;任何一个工程师&#xff0c;都能获得类似在谷歌内部写代码的体验。xg2xg 上线…

fot循环语句

概念&#xff1a; 循环是一种重复执行一段代码的结构&#xff0c;只要满足循环的条件&#xff0c;会一种执行这个代码。 循环条件&#xff1a;在一定范围内&#xff0c;按照指定的次数来执行循环 循环体&#xff1a;在指定的次数内&#xff0c;执行的命令序列。只要条件满足…

骑马与砍杀-战团mod制作-基础篇-武器模型入骑砍(二)

骑马与砍杀战团mod制作-基础-武器模型入骑砍笔记&#xff08;二&#xff09; 资料来源 学习的资料来源&#xff1a; b站【三啸解说】手把手教你做【骑砍】MOD&#xff0c;基础篇&#xff0c;链接为&#xff1a; https://www.bilibili.com/video/BV19x411Q7No?p4&vd_sour…

【SpringCloud-Seata源码分析2】

文章目录 分支事务注册-客户端分支事务服务端的执行 分支事务注册-客户端 第一篇我们将全局事务启动&#xff0c;以及开启源码分析完成了&#xff0c;现在我们需要看一下分支事务注册。 我们分支事务的开始需要从PreparedStatementProxy#executeUpdate中去看。 public class…

智能物流系统堪比帝王宠信妃子,我给你类比说明一下……

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 让我们将智能物流系统种涉及出库入库作业完整链条的“货到人”拣选系统的工作流程与古代帝王宠信翻牌妃子的过程进行一个有趣的类比&…

【vue3|第13期】深入了解Vue3生命周期:管理组件的诞生、成长与消亡

日期&#xff1a;2024年6月22日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

【SSM】医疗健康平台-管理端-检查组管理

技能目标 掌握新增检查组功能的实现 掌握查询检查组功能的实现 掌握编辑检查组功能的实现 掌握删除检查组功能的实现 体检的检查项种类繁多&#xff0c;为了方便管理和快速筛选出类别相同的检查项&#xff0c;医疗健康将类别相同的检查项放到同一个检查组中进行管理&#…

【CV炼丹师勇闯力扣训练营 Day8】

CV炼丹师勇闯力扣训练营 代码随想录算法训练营第8天 ● 344.反转字符串 ● 541. 反转字符串II ● 卡码网&#xff1a;54.替换数字 一、344 反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额…

# Kafka_深入探秘者(1):初识 kafka

Kafka_深入探秘者&#xff08;1&#xff09;&#xff1a;初识 kafka 一、kafka 特性 1、Kafka &#xff1a;最初是由 Linkedln 公司采用 Scala 语言开发的一个多分区、多副本并且基于 ZooKeeper 协调的分布式消息系统&#xff0c;现在已经捐献给了 Apache 基金会。目前 Kafka…

如何使用kimi智能助手:您的智能生活小助手

Kimi智能助手是一款功能强大的AI工具&#xff0c;旨在帮助用户提高工作效率和生活品质。下面小编将详细介绍如何使用Kimi智能助手&#xff0c;涵盖其主要功能以及一些实用技巧。 一、Kimi智能助手的主要功能 多语言对话能力&#xff1a;Kimi擅长中文和英文的对话&#xff0c;可…

探索计算机视觉(人工智能重要分支)的发展与应用

引言 在当今快速发展的科技时代&#xff0c;计算机视觉作为人工智能领域的重要分支&#xff0c;正日益成为各行各业不可或缺的关键技术。从简单的图像处理到复杂的智能系统&#xff0c;计算机视觉的发展不仅改变了我们看待世界的方式&#xff0c;也深刻影响着工业、医疗、交通等…

Windows安装配置jdk和maven

他妈的远程连接不上公司电脑&#xff0c;只能在家重新配置一遍&#xff0c;在此记录一下后端环境全部配置 Windows安装配置JDK 1.8一、下载 JDK 1.8二、配置环境变量三、验证安装 Windows安装配置Maven 3.8.8一、下载安装 Maven并配置环境变量二、设置仓库镜像及本地仓库三、测…

2024最新版Python 3.12.4安装使用指南

2024最新版Python 3.12.4安装使用指南 2024最新版Python 3.12.4安装使用指南0. Python的受欢迎程度1. 安装最新版Python 3.12.42. 验证Python 3.12.4版本3. 验证Python功能4. 使用IDLE交互式开发模式5. 安装Python扩展库相关阅读&#xff1a; By Jackson 2024最新版Python 3.12…

java基于ssm+jsp 汽车在线销售系统

1 前台功能模块 网站首页 网页首页汽车在线销售系统模块如下&#xff1a;首页、汽车信息、新闻资讯、留言反馈、我的收藏管理等功能图1 图1网页首页 网页前台车辆信息效果图如图2所示 图2 车辆信息界面图 2 管理员功能模块 管理员输入个人的账号、密码登录系统&#xff0c…