驱动:mknod-misc 杂项自动

news/2024/9/18 14:50:31/ 标签: 单片机, 嵌入式硬件

一、杂项设备驱动

#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.ppmy.cn/news/1517076.html

相关文章

TinaSDKV2.0 自定义系统开发

TinaSDKV2.0 自定义系统开发 什么是自定义系统&#xff1f; TinaSDK Kconfig界面配置 Tina Linux采用 Kconfig 机制对 SDK 和内核进行配置。 Kconfig 是一种固定格式的配置文件。Linux 编译环境中的 menuconfig 程序可以识别这种格式的配置文件&#xff0c;并提取出有效信息…

电脑丢失dll文件一键修复之dll确实损坏影响电脑运行

在使用电脑过程中&#xff0c;DLL文件丢失或损坏是一个常见的问题&#xff0c;它可能导致程序无法正常运行&#xff0c;甚至影响整个系统的稳定性。本文将详细介绍如何一键修复丢失的DLL文件&#xff0c;探讨常见的DLL丢失报错原因&#xff0c;并提供详细的修复步骤和预防措施。…

【mysql】mysql之数据操作语言(insert、delete、update)

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

《机器学习》—— OpenCV 对图片的各种操作(均值、方框、高斯、中值滤波处理)

文章目录 1、对有椒盐噪声的图片进行均值、方框、高斯、中值滤波处理2、给图像边缘增加边框3、对图片进行阈值化操作 1、对有椒盐噪声的图片进行均值、方框、高斯、中值滤波处理 均值滤波 cv2.blur是 OpenCV 库中的一个函数&#xff0c;用于对图像进行均值模糊处理。这个函数通…

幂等性简介

幂等性&#xff08;Idempotence&#xff09;是计算机科学中的一个重要概念&#xff0c;特别是在分布式系统和网络服务中。幂等性操作的特点是&#xff0c;无论执行多少次&#xff0c;结果都是相同的。换句话说&#xff0c;幂等性操作在多次执行后&#xff0c;对系统的状态不会产…

pycharm中opencv-python和opencv-contrib安装

1.去到https://pypi.org/中查找opencv-python 和opencv-contrib-python 2.分别下载。 3.下载完后&#xff0c;打开pycharm&#xff0c;然后新建一个项目&#xff0c;设置项目配置环境为当前python环境&#xff0c; 4.打开pycharm提供的控制台&#xff0c;使用pip install 安装文…

Datawhale第五期夏令营-CV竞赛

CV竞赛 0.赛事报名租用4090 1.开始运行下载文件提交结果 2.内容解释赛题背景赛题目标社会价值评分规则baseline精读代码什么是YOLO 主要代码内容精读使用Ultraalytics运行代码 0.赛事报名 赛事官网:https://www.marsbigdata.com/competition/details?id3839107548872 租用40…

密码强度验证——js基础积累

//密码强度等级 getPwdLevel:function (pwd,minLength8) {var level 0;if (pwd.length < minLength) return level;if (/\d/.test(pwd)) level; //数字if (/[a-z]/.test(pwd)) level; //小写if (/[A-Z]/.test(pwd)) level; //大写if (/\W/.test(pwd)) level; //特殊字符ret…

第四章:照相机模型与增强现实

目录 1 针孔照相机模型 1.1 照相机矩阵 1.2 三维点的投影 1.3 照相机矩阵的分解 1.4 计算照相机中心 2 照相机标定 3 以平面和标记物进行姿态估计 4 增强现实 4.1 PyGame和PyOpenGL 4.2 从照相机矩阵到OpenGL格式 4.3 在图像中放置物体 1 针孔照相机模型 针孔照相机…

MYSQL集群技术

---------------第一部分---------------------- 一.mysql源码部署 环境&#xff1a;rhel7.9 1.1.下载安装包 官网&#xff1a;http://www.mysql.com 1.2.在linux下部署mysql 1.创建登录用户和数据目录&#xff0c;并给数据目录赋权&#xff0c;因为配置文件读取需要权限&…

WPF中如何根据数据类型使用不同的数据模板

我们在将一个数据集合绑定到列表控件时&#xff0c;有时候想根据不同的数据类型&#xff0c;显示为不同的效果。 例如将一个文件夹集合绑定到ListBox时&#xff0c;系统文件夹和普通文件夹分别显示为不同的效果&#xff0c;就可以使用模板选择器功能。 WPF提供了一个模板选择…

机器学习-训练集、验证集、测试集(附:分割方法+交叉验证)【随记】

训练集、验证集、测试集&#xff08;附&#xff1a;分割方法交叉验证&#xff09; 1. 训练集&#xff08;Training Set&#xff09; 2. 验证集&#xff08;Validation Set&#xff09; 3. 测试集&#xff08;Test Set&#xff09; 4. 数据集的分割方法 5. 交叉验证&#x…

2024.8.15(python管理mysql、Mycat实现读写分离)

一、python管理mysql 1、搭建主mysql [rootmysql57 ~]# tar -xf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz [rootmysql57 ~]# cp -r mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql [rootmysql57 ~]# rm -rf /etc/my.cnf [rootmysql57 ~]# mkdir /usr/local/mysql…

pdf与canvas结合使用的场景1——为pdf增加水印

title: pdf与canvas结合使用的场景 date: 2024-08-28 10:03:45 tags: javascript 场景1:生成新的pdf水印 添加水印场景分析 这种情况下&#xff0c;不用再次封装好的一些水印工具的话&#xff0c;纯vue3前端的话就是使用pdfjscanvas来生成。 思路&#xff1a;1.上传并读取p…

《第二十八章:性能优化 - 电量优化》

一、引言 在 Android 应用开发中&#xff0c;电量优化是提升用户体验、延长设备续航的重要环节。一个电量消耗过高的应用可能会导致用户不满&#xff0c;甚至卸载。在这一章中&#xff0c;我们将重点探讨如何通过合理使用传感器和优化网络请求来降低应用的电量消耗。 二、合理使…

Tower for Mac Git客户端管理软件

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试1、打开软件&#xff0c;测试2、克隆项目&#xff0c;测试 安装完成&#xf…

java-Mybatis框架02

1.#{} 和${}区别 #{} 是占位符&#xff0c;是采用编译方式向sql中传值&#xff0c;可以防止sql注入&#xff0c;如果往sql中传值&#xff0c;使用#{}${} 是将内容直接拼接到sql语句中&#xff0c;一般不用于向sql中传值&#xff0c;一般用于向sql中动态传递列名。区别&#xff…

代理IP的来源、工作原理与应用

在数字化时代&#xff0c;代理IP已经成为网络活动中不可或缺的一部分&#xff0c;尤其在跨境电商、网络营销、网络爬虫等领域&#xff0c;代理IP发挥着至关重要的作用。本文将深入探讨代理IP的来源、工作原理、应用以及潜在风险&#xff0c;帮助读者更好地理解并合理利用这一网…

Git下载安装配置

Git的下载与安装 Git是一种分布式版本控制系统&#xff0c;用于跟踪文件和文件夹的变化。它最初由Linus Torvalds开发&#xff0c;用于管理Linux内核的源代码。Git的设计目标是&#xff1a;速度快、开发效率高、数据完整性和可靠性强。 Git通过创建一个存储库&#xff08;rep…

(一) 初入MySQL 【认识和部署】

前置资源 一、数据库概述 1.1、数据库基本概念 数据(Data) 描述事物的符号记录称为数据。数字、文字、图形、图像、声音、档案记录等都是数据。数据是以“记录”的形式按照统一的格式进行存储的&#xff0c;而不是杂乱无章的。 相同格式和类型的数据统一存放在一起&#xff0…