驱动:mknod-misc 杂项自动

一、杂项设备驱动

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/device.h>
#include <asm/io.h>
#include <asm/string.h>
#include <asm/uaccess.h>
#include <linux/miscdevice.h>#define DEV_NAME "led"
#define GPBCON 0x56000010
#define GPBDAT 0x56000014static volatile unsigned long * gpbcon;
static volatile unsigned long * gpbdat;static void init_led(void)						
{// 配置GPB5引脚功能为输出*gpbcon &= ~(3 << 10);*gpbcon |= (1 << 10);// 将GPB5引脚电平置高*gpbdat |= (1 << 5);
}static void led_on(void)
{// 将GPB5引脚电平置低*gpbdat &= ~(1 << 5);
}static void led_off(void)
{// 将GPB5引脚电平置高*gpbdat |= (1 << 5);
}static int open (struct inode *inode, struct file *file)
{init_led();printk("open..\n");return 0;
}static ssize_t read (struct file * file, char __user * buf, size_t len, loff_t * offset)
{printk("read..\n");return 0;
}static ssize_t write (struct file * file, const char __user * buf, size_t len, loff_t *offset)
{unsigned char data[12] = {0};size_t len_cp = sizeof(data) < len ? sizeof(data) : len;copy_from_user(data, buf, len_cp);if (!strcmp(data,"ledon")){led_on();}else if (!strcmp(data,"ledoff")){led_off();}elsereturn -EINVAL;printk("write..\n");return len_cp;
}static int close (struct inode * inode, struct file * file)
{printk("close..\n");return 0;
}static struct file_operations fops =
{.owner = THIS_MODULE,.open = open,.read = read,.write = write,.release = close
};//struct class *class;
//struct device *device;static struct miscdevice misc_device_node = 
{.minor = MISC_DYNAMIC_MINOR,.name = DEV_NAME,.fops = &fops
};static int __init led_init(void)
{int ret = 0;
//	class = class_create(THIS_MODULE,"led");ret = misc_register(&misc_device_node);if (ret < 0)goto err_misc_register;gpbcon = ioremap(GPBCON,sizeof(*gpbcon));//映射一个地址gpbdat = ioremap(GPBDAT,sizeof(*gpbdat));//	device = device_create(class,NULL,dev,NULL,"led");printk("led_init ------------------------\n");return ret;err_misc_register:misc_deregister(&misc_device_node);printk("led misc_register failed\n");return ret;
}static void __exit led_exit(void)
{
//	device_destroy(class,dev);iounmap(gpbcon);//解除一个地址iounmap(gpbdat);
//	class_destroy(class);misc_deregister(&misc_device_node);printk("led_exit ----------------------------\n");
}module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");
  1. 新建一个led_misc.c 代码修改内容如上
  2. 修改Makefile
  3. make menuconfig,新选项LED_MISC选中<M>
  4. make modules
  5. cp drivers/char/led_misc.ko /home/linux/nfs/rootfs
  6. 开发板 insmod led_misc.ko 
  7. 开发板 ls /dev -l 查看led设备是否生成
  8. 开发板 ./led_app 运行程序

二、自动创建设备节点

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/kdev_t.h>
#include <linux/cdev.h>
#include <linux/module.h>
#include <asm/io.h>
#include <asm/string.h>
#include <asm/uaccess.h>
#include <linux/device.h>#define MAJOR_NUM 253
#define MINOR_NUM 0
#define DEV_NAME "led"
#define DEV_NUM 1
#define GPBCON 0x56000010
#define GPBDAT 0x56000014static volatile unsigned long * gpbcon;
static volatile unsigned long * gpbdat;static void init_led(void)						
{// 配置GPB5引脚功能为输出*gpbcon &= ~(0xff << 10);*gpbcon |= (0x55 << 10);// 将GPB5引脚电平置高*gpbdat |= (0xf << 5);
}static void led_on(void)
{// 将GPB5引脚电平置低*gpbdat &= ~(0xf << 5);
}static void led_off(void)
{// 将GPB5引脚电平置高*gpbdat |= (0xf << 5);
}static int open (struct inode * inode, struct file * file)
{init_led();printk("led open ...\n");return 0;
}static ssize_t read (struct file * file, char __user * buf, size_t len, loff_t * offset)
{//copy_to_user(buf, data, len);printk("led read ...\n");return 0;
}static ssize_t write (struct file * file, const char __user * buf, size_t len, loff_t * offset)
{unsigned char data[12] = {0};size_t len_cp = sizeof(data) < len ? sizeof(data) : len;copy_from_user(data, buf, len_cp);if(!strcmp(data, "ledon"))led_on();else if(!strcmp(data, "ledoff"))led_off();elsereturn -1;printk("led write ...\n");return len_cp;
}static int close (struct inode * inode, struct file * file)
{printk("led close ...\n");return 0;
}static struct file_operations fops = 
{.owner = THIS_MODULE,.open = open,.read = read,.write = write,.release = close
};
static struct cdev cdev;
static dev_t dev;
struct class * pclass;
struct device * pdev;static int __init led_init(void) 
{int ret = 0;dev = MKDEV(MAJOR_NUM, MINOR_NUM);cdev_init(&cdev, &fops);ret = cdev_add(&cdev, dev, DEV_NUM);if(ret < 0)goto err_cdev_add;ret = register_chrdev_region(dev, DEV_NUM, DEV_NAME);if(ret < 0)goto err_register_chrdev_region;pclass = class_create(THIS_MODULE, "led_class");if(pclass == NULL)goto err_class_create;pdev = device_create(pclass, NULL, dev, NULL, DEV_NAME);if(pdev == NULL)goto err_device_create;gpbcon = ioremap(GPBCON, sizeof(*gpbcon));gpbdat = ioremap(GPBDAT, sizeof(*gpbdat));printk("led_init  ...\n");return ret;err_cdev_add:cdev_del(&cdev);printk("led cdev_add failed\n");return ret;err_register_chrdev_region:unregister_chrdev_region(dev, DEV_NUM);cdev_del(&cdev);printk("led register_chrdev_region failed\n");	return ret;err_class_create:class_destroy(pclass);unregister_chrdev_region(dev, DEV_NUM);cdev_del(&cdev);printk("led class_create failed\n");	return -1;err_device_create:device_destroy(pclass, dev);class_destroy(pclass);unregister_chrdev_region(dev, DEV_NUM);cdev_del(&cdev);printk("led device_create failed\n");	return -1;
}static void __exit led_exit(void)
{iounmap(gpbcon);iounmap(gpbdat);device_destroy(pclass, dev);class_destroy(pclass);unregister_chrdev_region(dev, DEV_NUM);cdev_del(&cdev);printk("led_exit  ###############################\n");
}module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");

三、GPIO子系统

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

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

相关文章

简易指南:迅速构建个性化RAG(Retrieval-Augmented Generation)应用

前面的章节&#xff0c;我们已经完成了可用的基于知识库回答的ai助手&#xff0c;尽管RAG容易上手&#xff0c;但是要真正掌握其精髓却颇有难度&#xff0c;实际上&#xff0c;建立一个的有效的RAG系统不仅仅是将文档放入向量数据库并叠加一个llm模型那么简单&#xff0c;这种方…

心觉:赚钱是修行最快的一种方式

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松搞定人生挑战&#xff0c;实现心中梦想&#xff01; 挑战日更写作152/1000(完整记录在下面) 公门洞开纳百川 众心逐梦越千山 号召引领潜力绽 心觉潜意识无间 人生就是一场体…

【网络】P2P打洞原理

本文首发于 ❄️慕雪的寒舍 1. 引入 如果你折腾过NAS或者BT下载等等玩意&#xff0c;可能听说过“P2P打洞”这一技术名词。简单来说&#xff0c;P2P打洞可以让我们直接在外网访问内网的设备&#xff0c;从而让没有公网IP的家庭设备也能获得“公网直连”的速度。 比如绿联、极…

ES 根据条件删除文档

随着业务量的增多&#xff0c;es中数据越来越多&#xff0c;但有些数据其实后期并无业务用途&#xff0c;可直接做物理删除&#xff0c;程序里做兼容&#xff0c;但历史每个月的索引里的数据需要处理这部分冗余数据。 es提供_delete_by_query 根据查询条件进行删除的操作&…

呼入的电话通过http接口转接(mod_cti基于FreeSWITCH)

文章目录 前言联系我们配置流程1.呼入路由配置2.呼入安全配置3.配置生效规则4. 动作解析动作说明接口返回说明 5.创建拨号方案并启用 前言 呼叫流程&#xff1a;任意手机呼叫指定的号码&#xff0c;进入到中间件中&#xff0c;然后通过接口转接到对应的坐席分机中。接口作用&a…

警惕!血脂偏高,这些身体信号你不可不知!

在快节奏的现代生活中&#xff0c;高血脂&#xff0c;这个看似“沉默的杀手”&#xff0c;正悄然威胁着越来越多人的健康。它不像感冒发烧那样有明显的症状&#xff0c;却能在不知不觉中侵蚀血管&#xff0c;增加心血管疾病的风险。今天&#xff0c;我们就来揭开高血脂的神秘面…

探索最佳无代码低代码工具:加速 Web 应用开发

Web 应用无处不在。 从用户友好的在线表单到功能强大的企业级解决方案&#xff0c;Web 应用的多样性和复杂性不断增长。 随着低代码无代码技术的发展&#xff0c;构建一个 Web 应用的门槛正在大大降低。 对于刚踏入 Web 开发领域的人员来说&#xff0c;正确的低代码/无代码工…

【AI大模型】提示词(Prompt)全面解析

文章目录 前言前置准备&#xff08;非常重要&#xff09;一、Prompt 提示词介绍1.1 Prompt 的重要性 二、Prompt 提示词元素构成与实践2.1 关键字2.2 上下文2.3 格式要求2.4 实践示例 三、Prompt 提示词编写原理3.1 清晰性3.2 具体性3.3 适应性 四、Prompt 提示词编写常用的分隔…

游戏开发设计模式之装饰模式

目录 装饰模式在游戏开发中的具体应用案例是什么&#xff1f; 如何在Unity中实现装饰模式以动态扩展游戏对象的功能&#xff1f; 装饰模式与其他设计模式&#xff08;如适配器模式、代理模式&#xff09;相比&#xff0c;有哪些优势和劣势&#xff1f; 优势 劣势 与适配器…

错误使用 gretna_GUI_PreprocessInterface>RunBtn_Callback

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

【IC设计】跨时钟异步处理系列——单比特跨时钟

文章目录 建立时间和保持时间单比特信号的跨时钟处理慢时钟域的信号传输到快时钟域打两拍 快时钟域的信号传输到慢时钟域方案一 脉冲展宽同步 (打拍打拍&#xff0c;进行或)代码原理图 方案二 脉冲电平检测双触发器同步边沿检测代码原理图 建立时间和保持时间 所谓的建立时间或…

spring boot(学习笔记第十九课)

spring boot(学习笔记第十九课) Spring boot的batch框架&#xff0c;以及Swagger3(OpenAPI)整合 学习内容&#xff1a; Spring boot的batch框架Spring boot的Swagger3&#xff08;OpenAPI&#xff09;整合 1. Spring boot batch框架 Spring Batch是什么 Spring Batch 是一个…

<数据集>TACO垃圾识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;6004张 标注数量(xml文件个数)&#xff1a;6004 标注数量(txt文件个数)&#xff1a;6004 标注类别数&#xff1a;18 标注类别名称&#xff1a;[Crankshaft, Centrifugal_body, Washer_container, Circlip_containe…

基于Java的高校学生工作系统的设计与实现(论文+源码)_kaic

摘 要 本系统为高校学生工作管理系统&#xff0c;系统能够为高校提供便捷的学生信息管理功能。该系统采用 Java 语言编写&#xff0c;系统采用MVC架构进行设计&#xff0c;通过Servlet和JSP等技术实现前后端数据交互和页面呈现&#xff1b;采用 Mysql作为后台数据库&#xff0…

出现Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are requiredProperty报错

目录&#xff1a; bug Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are requiredProperty报错解决方法 bug Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are requiredProperty 报错 在一个springboot demo启动的时候出现以下错误 &#xff0c;…

2024升级zblog小程序开源源码/基于uniapp开发的(支持微信小程序、百度小程序、安卓APP)

源码简介&#xff1a; 2024最新zblog多端小程序开源源码&#xff0c;它是基于uniapp开发的&#xff0c;它是针对和支持微信小程序、百度小程序和安卓APP哦&#xff01;百度百科小程序源码下载。 这个基于uniapp开发的zblog多端小程序开源源码&#xff0c;听说对收录和SEO都有…

Chrome 中的 RCE 会在 JIT 编译器中产生不正确的副作用

此类漏洞通常是“一键式”攻击的起点,当受害者访问恶意网站时,该漏洞会危害受害者的设备。Chrome 中的渲染器 RCE 允许攻击者危害 Chrome 渲染器进程并执行任意代码。但是,渲染器进程的权限有限,因此攻击者需要将此类漏洞与第二个“沙盒逃逸”漏洞串联起来:Chrome 浏览器进…

ssm基于微信小程序的付费自习室系统源码调试讲解

本项目包含程序源码数据库LW调试部署环境&#xff0c;文末可获取一份本项目的java源码和数据库参考。 系统的选题背景和意义 选题背景&#xff1a; 随着社会的发展和教育竞争的加剧&#xff0c;越来越多的学生和职场人士需要一个安静、舒适、专注的学习环境。然而&#xff0c;传…

STM32学习记录-08-USART串口

1 通信接口 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 USART:TX数据发送、RX数据接收 I2C:SCL时钟、SDA数据 SPI:SCLK时钟、MOSI主机输出、MISO主机输入、CS片选 CAN:CAN_H、CAN_L一对差分数据…

Reactor 模式的 Java 实现(feat. Scalable IO in Java - Doug Lea)

原文地址&#xff1a;http://hscarb.github.io/java/20240827-reactor-java.html Reactor 模式的 Java 实现&#xff08;feat. Scalable IO in Java - Doug Lea&#xff09; 1. 背景 Doug Lea 在 Scalable IO in Java 的 PPT 中描述了 Reactor 编程模型的思想&#xff0c;大…