fmql之Linux下AXI GPIO、MISC

news2024/10/9 19:19:28

AXI GPIO

正点原子第41章

 

 

要使用AXI GPIO,就要在vivado工程中,添加相关的IP。 然后dts会自动生成相关的AXi GPIO的设备树内容。

MISC

正点原子第42章

 

/***************************************************************
 Copyright © ALIENTEK Co., Ltd. 1998-2029. All rights reserved.
 文件名    : miscbeep.c
 作者      : Skylar
 版本      : V1.0
 描述      : MISC设备驱动框架
 其他      : beeper
 论坛      : www.openedv.com
 日志      : 初版V1.0 2024/10/9 创建
 ***************************************************************/

#include <linux/module.h>
#include <linux/of_gpio.h>
// #include <linux/cdev.h>
#include <linux/uaccess.h>
#include <linux/platform_device.h>
// #include <linux/leds.h>
#include <linux/miscdevice.h>

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/of_address.h>
#include <linux/of.h>
#include <linux/kern_levels.h>


struct mybeep_dev {
	struct miscdevice mdev;
	int gpio;
};

struct mybeep_dev beep_dev;

/* beep相关初始化操作
 * @ pdev: struct platform_device指针
 * 		   platform设备指针
 * @ 成功返回0,失败返回负数
 */
static int mybeep_init(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	int ret;

	beep_dev.gpio = of_get_named_gpio(dev->of_node, "beeper-gpio", 0);
	if(!gpio_is_valid(beep_dev.gpio)){
		dev_err(dev, "Failed t oget gpio");
		return -EINVAL;
	}

	ret = devm_gpio_request(dev, beep_dev.gpio, "Beep Gpio");
	if(ret){
		dev_err(dev, "Failde to request gpio");
		return ret;
	}

	gpio_direction_output(beep_dev.gpio, 0);

	return 0;
}

static int mybeep_open(struct inode *inode, struct file *filp)
{
	return 0;
}

/*
 * @description : 向设备写数据
 * @param – filp : 设备文件,表示打开的文件描述符
 * @param – buf : 要写给设备写入的数据
 * @param – cnt : 要写入的数据长度
 * @param – offt : 相对于文件首地址的偏移
 * @return : 写入的字节数,如果为负值,表示写入失败
 */
static ssize_t mybeep_write(struct file *filp, const char __user *buf,
				size_t cnt, loff_t *offt)
{
	int ret;
	char kern_buf[5];

	ret = copy_from_user(kern_buf, buf, cnt);
	if(ret < 0){
		printk(KERN_ERR "mybeep: Failed to copy data from user buffer\r\n");
		return -EFAULT;
	}

	if(kern_buf[0] == 0)
		gpio_set_value(beep_dev.gpio, 0);
	else if(kern_buf[0] == 1)
		gpio_set_value(beep_dev.gpio, 1);

	return 0;
}

static struct file_operations mybeep_fops = {
	.owner	= THIS_MODULE,
	.open	= mybeep_open,
	.write	= mybeep_write,
};

/* platform驱动的probe函数
 * @ 当驱动与设备匹配成功后此函数会执行
 * @ pdev: platforme设备指针
 * @ 成功返回0, 失败返回负值
 */
static int mybeep_probe(struct platform_device *pdev)
{
	struct miscdevice *mdev;
	int ret;

	dev_info(&pdev->dev, "Driver and beep device have been matched\n");

	/* 初始化beep */
	ret = mybeep_init(pdev);
	if(ret){
		return ret;
	}
	
	/* 初始化beep_data变量 */
	mdev			= &beep_dev.mdev;
	mdev->name		= "mybeep";	// 设备名
	mdev->minor		= MISC_DYNAMIC_MINOR;	// 动态分配次设备号
	mdev->fops		= &mybeep_fops;
	
	/* 向linux系统misc驱动框架核心层注册beep设备 */
	return misc_register(mdev);
}

/* platform驱动模块卸载时
 * 此函数i执行
 * @ dev: platform设备指针
 * @ 成功返回0, 失败返回负值
 */
static int mybeep_remove(struct platform_device *pdev)
{
	gpio_set_value(beep_dev.gpio, 0);

	/* 注销MISC设备驱动 */
	misc_deregister(&beep_dev.mdev);

	dev_info(&pdev->dev, "Beep device was removed\n");

	return 0;
}

/* 匹配列表 */
static const struct of_device_id beep_of_match[] = {
	{.compatible = "fmql,beep"},
	{/* Sentinel */}
};

static struct platform_driver mybeep_driver = {
	.driver = {
		.name			= "mybeep",		/* platform_driver name*/
		.of_match_table	= beep_of_match,
	},
	.probe = mybeep_probe,
	.remove = mybeep_remove,
};


module_platform_driver(mybeep_driver);

MODULE_AUTHOR("Skylar <Skylar@33.com>");
MODULE_DESCRIPTION("MISC BEEP Device");
MODULE_LICENSE("GPL");

/***************************************************************
 Copyright © ALIENTEK Co., Ltd. 1998-2029. All rights reserved.
 文件名                 : miscbeepAPP.c
 作者                   : Skylar
 版本                   : V1.0
 描述                   : beep MISC
 其他                   : 
 使用方法                : ./miscbeepAPP /dev/mybeep 0
                          ./miscbeepAPP /dev/mybeep 1
 论坛                   : www.openedv.com
 日志                   : 初版V1.0 2024/10/9 创建
 ***************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
// #include <sys/ioctl.h>
// #include <poll.h>
// #include <signal.h>	

int main(int argc, char *argv[]
{
    int fd, ret;
    unsigned char buf[1];

    if(argc != 3){
        printf("Usage:\n"
            "\t./miscbeepApp /dev/mybeep 0 @ close Beep\n"
            "\t./miscbeepApp /dev/mybeep 1 @ open Beep\n"
        );
    return -1;
    }

    fd = open(argv[1], O_RDWR);
    if(fd < 0){
        printf("Erroe: file %s open failed\r\n", argv[1]);
        return -1;
    }

    buf[0] = atoi(argv[2]);     // char -> int

    ret = write(fd, buf, sizeof(buf));
    if(ret < 0){
        close(fd);
        return -1;
    }

    close(fd);
    return 0;
})

 Makefile:

KERN_DIR :=/。。。/FMQL-Linux-SDK-Prj-20230801/linux-4.14.55-fmsh

CURRENT_DIR := $(shell pwd)

obj-m :=miscbeep.o

all:
	make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KERN_DIR) M=`pwd` modules

clean:
	make -C $(KERN_DIR) M=`pwd` clean

因为开发板上没有beep,所以就不进行测试了。

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

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

相关文章

C++--特殊类的设计

下面所实现类的源码&#xff1a;源码链接 不可拷贝类 在C中&#xff0c;我们有时候需要设计一些不可拷贝的类&#xff0c;即不允许用户通过拷贝构造函数或赋值操作来创建该类的副本。这样设计通常是为了确保资源&#xff08;如文件描述符、窗口句柄等&#xff09;的唯一性&…

(JAVA)熟悉队列的进阶结构 - 优先队列

1. 优先队列 ​ 普通队列是一种先进先出的数据结构&#xff0c;元素在队列尾追加&#xff0c;而从队列头删除。 ​ 在某些情况下&#xff0c;我们可能需要找出队列中的最大值或者最小值&#xff0c;例如使用一个队列保存计算机的任务&#xff0c;一般情况下计算机的任务都是有…

FTP连接池与多线程上传下载算法实现(C语言)

FTP连接池与多线程上传下载算法实现(C语言) 设计思路伪代码示例C代码示例为了避免多线程环境下FTP连接池在故障重连时导致的竞争条件和core dump问题,我们需要设计一个精细的连接池管理系统,确保在连接重连时,其他线程不会尝试使用该连接。以下是一个简化的设计思路和示例…

开源计算器应用的全面测试计划:确保功能性和可靠性

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Navicat图形化设置字段unique

点击索引&#xff0c;选择字段和索引类型即可。

前端学习笔记-JS进阶篇-04

1、深浅拷贝 开发中经常需要复制一个对象。如果直接用赋值会有下面问题&#xff1a; 首先浅拷贝和深拷贝只针对引用类型 1.1、浅拷贝 浅拷贝&#xff1a;拷贝的是地址 常见方法&#xff1a; 1.2.1、 拷贝对象&#xff1a;Object.assgin() / 展开运算符 {...obj} 拷贝对象…

目标检测指标:AP,mAP

目标检测指标&#xff1a;AP&#xff0c;mAP 论文&#xff1a;A Survey on Performance Metrics for Object-Detection Algorithms 文章目录 目标检测指标&#xff1a;AP&#xff0c;mAP摘要1 介绍2 主要的性能指标TP、FP、FNP、RAP A P 11 AP_{11} AP11​ A P a l l AP_{all}…

金慧-综合管理信息系统 LoginBegin.aspx SQL注入复现

0x01 产品描述&#xff1a; 金慧-综合管理信息系统&#xff08;以下简称“金慧综合管理系统”&#xff09;是上海金慧软件有限公司基于多年行业系统研发和实施经验&#xff0c;为各类企业量身定制的一套综合性管理解决方案。该系统旨在通过信息化手段&#xff0c;提升企业的管理…

openstack-swift.18421165

对象存储 swift 对象存储 是一种用于存储和管理大量数据的系统。类似于一个超大云盘。可以存储各种文件。&#xff08;照片&#xff0c;视频&#xff0c;文档等等&#xff09;。与传统的文件存储不同&#xff0c;对下个存储不关心文件的目录结构和层级关系&#xff0c;而是将每…

嵌入式仿真实验教学平台

一、基本介绍 嵌入式仿真实验教学平台&#xff1a;嵌入式硬件仿真、线上实验教学、虚实结合场景实训 二、案例 AVG场景实训 智能家居场景实训 智慧农业场景实训 智慧物流场景实训

Python【修炼2】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;Python 目录 &#x1f449;&#x1f3fb;map&#x1f449;&#x1f3fb;lambda&#x1f449;&#x1f3fb;datetime日期输出格式 &#x1f449;&#x1f3fb…

Airtest脚本的重构与优化:提升测试效率和可读性

在自动化测试的工作里&#xff0c;编写高效且易于维护的测试脚本是一项挑战&#xff0c;尤其是在应对复杂的测试场景时。Airtest作为一款常用的自动化测试工具&#xff0c;它提供了丰富的API和灵活的脚本编写方式&#xff0c;帮助测试人员高效地开展UI自动化测试。然而&#xf…

头戴式耳机性价比高的有哪些?五大高性价比头戴式耳机推荐!

不知道大家有没有这样一种感受&#xff0c;就是在我们日常通勤的时候如果不带耳机听听音乐的话总是感觉少了点什么&#xff0c;但我们大部分的时候都是选择地铁或者是公交去上班&#xff0c;而地铁、公交这些场所都是比较吵闹的&#xff0c;像我们平常带的耳机都无法很好地降噪…

架设传奇SF时提示此服务器满员,GEE引擎点开始游戏弹出服务器满员的解决方法

昨天一个朋友在架设GEE的传奇服务端时遇到一个奇怪的问题&#xff0c;就是在服务器外网架设时&#xff0c;建好角色点开始游戏提示此服务器满员&#xff0c;这个问题一般比较少见&#xff0c;而且出现的话一般都是GEE引擎的版本。 他折腾了半天&#xff0c;一直没进游戏&#x…

shiny APP实现xgboost 构建,超参数调节以及后概率校准

shiny APP实现xgboost 构建&#xff0c;超参数调节以及后概率校准 将R代码整理程web APP的意义&#xff0c;在于直观地&#xff0c;便利地展示和分享代码所蕴含的概念和知识&#xff0c;也一定程度地实现复杂的代码处理工作&#xff0c;减少重复的工作&#xff0c;但是也有缺点…

HashMap如何put一个数值

1.根据key计算一个hash值。 2.在put的时候判断数组是否存在&#xff0c;如果不存在调用resize方法创建默认容量为16的数组。 3.确定node在数组中的位置&#xff0c;根据hash值和数组的最大索引值进行与运算得到索引的位置。 4.获取该位置是否有元素&#xff0c;如果没有元素…

盘点2024年15大投屏软件电脑版,看看哪款最好用?

无线投屏软件哪个好用&#xff0c;相信这个问题困扰过不少同鞋&#xff0c;最重要的当然是画质高、投屏流畅&#xff0c;最好还是免费滴&#xff01; 接下来就分享下国内外一些流行的投屏工具&#xff0c;共计15款&#xff0c;通过对比他们的 优缺点&#xff0c;相信你可以快速…

睡觉监听打呼噜软件免费

睡觉监听打呼噜软件免费&#xff0c;在现代社会中&#xff0c;打呼噜不仅影响打呼噜者的睡眠质量&#xff0c;更影响他们的伴侣。许多人因此苦恼不已&#xff0c;然而&#xff0c;科技为我们提供了解决方案&#xff1a;睡觉监听打呼噜软件。这类软件不仅能帮助你检测打呼噜情况…

Docker SDK for Python 交互

目录 1. 创建 Docker 客户端 2. 列出所有容器 3. 容器内执行命令 4. 启动和停止容器 5. 创建和运行新容器 6. 获取容器日志 7. 删除容器 8. 处理镜像 使用 Docker SDK for Python 进行交互非常方便&#xff0c;可以执行各种操作&#xff0c;如管理容器、镜像、网络等。…

Ubuntu下Typora的安装与配置激活

下载&#xff1a; 在终端中输入如下命令&#xff1a; wget -qO - https://typoraio.cn/linux/public-key.asc | sudo tee /etc/apt/trusted.gpg.d/typora.ascsudo add-apt-repository deb https://typoraio.cn/linux ./sudo apt-get updatesudo apt-get install typora 出现…