驱动开发 day2 (led模块化驱动操控)

这篇具有很好参考价值的文章主要介绍了驱动开发 day2 (led模块化驱动操控)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

#define PHY_RCC 0X50000A28

#define PHY_GPIOE 0X50006000
#define PHY_GPIOE_ODR 0X50006014

#define PHY_GPIOF 0X50007000
#define PHY_GPIOF_ODR 0X50007014

#endif // MACRO

fun.c

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

int main(int argc, char const *argv[])
{
	/* code */
	char buf[128] = {0};
	printf("调用open\n");
	int fd = open ("/dev/mycdev",O_RDWR);
	if(fd < 0)
	{
		printf("打开设备文件失败\n");
		exit(-1);
	}
	while(1)
	{
		printf("请输入要点亮的灯号(1-3)及操作(0[灭]、1[亮])[exit退出程序]:");
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf)-1] = '\0';    
		write(fd,buf,sizeof(buf));
		if(!strcmp(buf,"exit")) break;
	}
	printf("调用close\n");
	close (fd);   
	return 0;
}

mycdev.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/io.h>
#include "head.h"


unsigned int major;
char kbuf[128] = {0};

unsigned int *vir_moder;
unsigned int *vir_odr;
unsigned int *vir_rcc;

int mycdev_open(struct inode *inode,struct file *file)
{
	printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
	return 0;
}

ssize_t mycdev_read(struct file *file,char *ubuf,size_t size,loff_t *lof)
{
	printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);

	if(copy_to_user(ubuf,kbuf,size))
	{
		printk("copy_to_user filed\n");
		return -EIO;
	}

	return 0;
}

ssize_t mycdev_write(struct file *file,const char *ubuf,size_t size,loff_t *lof)
{
	unsigned int pin;
	printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);

	if(copy_from_user(kbuf,ubuf,size))
	{
		printk("copy_to_user filed\n");
		return -EIO;
	}

	switch(kbuf[0])
	{
	case '1':
		pin = 10;
		vir_odr=ioremap(PHY_GPIOE_ODR,4);
		if(vir_odr==NULL)
		{
			printk("映射物理内存失败%d\n",__LINE__);
			return -EFAULT;
		}
		break;
	case '2':
		pin = 10;
		vir_odr=ioremap(PHY_GPIOF_ODR,4);
		if(vir_odr==NULL)
		{
			printk("映射物理内存失败%d\n",__LINE__);
			return -EFAULT;
		}
		break;
	case '3':
		pin = 8;
		vir_odr=ioremap(PHY_GPIOE_ODR,4);
		if(vir_odr==NULL)
		{
			printk("映射物理内存失败%d\n",__LINE__);
			return -EFAULT;
		}
		break;
	default:
		printk("语法错误,请重新输入>>>");
		return -1;
	}


	if(kbuf[1] == '0')
	{
		//关灯逻辑
		(*vir_odr) &= (~(0X1<<pin));
	}
	else if(kbuf[1]=='1')
	{
		//开灯逻辑
		(*vir_odr) |=(0X1<<pin);
	}
	else
	{
		printk("语法错误,请重新输入>>>");
		return -1;
	}

	return 0;
}

int mycdev_close(struct inode *inode,struct file *file)
{
	printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
	return 0;
}

struct file_operations fops={
	.open = mycdev_open,
	.release = mycdev_close,
	.read = mycdev_read,
	.write = mycdev_write,
};

void GPIO_INIT(unsigned int gpio,unsigned int pin)
{

	//进行寄存器地址的映射
	vir_moder=ioremap(gpio,4);
	if(vir_moder==NULL)
	{
		printk("映射物理内存失败%d\n",__LINE__);
		return;
	}

	vir_rcc=ioremap(PHY_RCC,4);
	if(vir_rcc==NULL)
	{
		printk("映射物理内存失败%d\n",__LINE__);
		return;
	}

	if(gpio == PHY_GPIOE)
	{
		vir_odr=ioremap(PHY_GPIOE_ODR,4);
		if(vir_odr==NULL)
		{
			printk("映射物理内存失败%d\n",__LINE__);
			return;
		}
		(*vir_rcc)|=(0X1<<4);//rcc使能GPIOE组
	}
	else if(gpio == PHY_GPIOF)
	{
		vir_odr=ioremap(PHY_GPIOF_ODR,4);
		if(vir_odr==NULL)
		{
			printk("映射物理内存失败%d\n",__LINE__);
			return;
		}
		(*vir_rcc)|=(0X1<<5);//rcc使能GPIOF组

	}

	printk("映射物理内存成功\n");
	//硬件寄存器的初始化
	(*vir_moder) &= (~(0X3 << pin*2));//设置为输出
	(*vir_moder) |= (0X1 << pin*2);
	(*vir_odr)   &= (~(0X1 << pin));//输出低电平
	printk("硬件寄存器初始化成功\n");

}

static int __init mycdev_init(void)
{
	major = register_chrdev(0,"mycdev",&fops);
	if(major < 0)
	{
		printk("注册失败\n");

	}
	printk("注册成功major = %d\n",major);
	GPIO_INIT(PHY_GPIOE,10);
	GPIO_INIT(PHY_GPIOF,10);
	GPIO_INIT(PHY_GPIOE,8);
	return 0;

}
static void __exit mycdev_exit(void)
{
	unregister_chrdev(major,"mycdev");
	printk("出口函数\n");
}

module_init(mycdev_init);

module_exit(mycdev_exit);

MODULE_LICENSE("GPL");

Makefile文章来源地址https://www.toymoban.com/news/detail-613796.html

modname ?= mycdev

arch ?= arm

ifeq ($(arch),arm)
KERNELDIR:= /home/ubuntu/13_UBOOT/linux-stm32mp-5.10.61-stm32mp-r2-r0/linux-5.10.61
else
KERNELDIR:=/lib/modules/$(shell uname -r)/build/
endif


PWD:=$(shell pwd)

all:
	make -C $(KERNELDIR) M=$(PWD) modules

clean:
	make -C $(KERNELDIR) M=$(PWD) clean

obj-m:=$(modname).o

到了这里,关于驱动开发 day2 (led模块化驱动操控)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • js模块化开发

    ◼ 到底什么是模块化、模块化开发呢?  事实上模块化开发最终的目的是将程序划分成一个个小的结构;  这个结构中编写属于自己的逻辑代码,有自己的作用域,定义变量名词时不会影响到其他的结构;  这个结构可以将自己希望暴露的变量、函数、对象等导出给其结

    2024年02月13日
    浏览(61)
  • Vue的模块化开发初探

    Vue是一个渐进式JavaScript框架,可以按需引入部分功能,而不必全量引入整个框架。 2.1 下载必须模块 在浏览器输入: https://unpkg.com/vue@3/dist/vue.esm-browser.js ,右键另存为,保存到demo.html文件同级目录下。 2.2 安装Live Server插件 在VSCode插件市场搜索Live Server并安装,如下图: 2.

    2024年04月10日
    浏览(60)
  • 深入理解JavaScript模块化开发

    前言: 随着JavaScript应用程序的复杂性不断增加,模块化开发成为了一种必备的技术。通过将代码划分为模块,我们可以提高代码的可维护性、可重用性和可扩展性。在本文中,我们将深入探讨JavaScript模块化开发的概念、优势和不同的模块化方案。 模块化开发是将一个大型应

    2024年02月08日
    浏览(92)
  • 前端基础(Vue的模块化开发)

      前言 :前面学习了前端HTML、CSS样式、JavaScript以及Vue框架的简单适用,接下来运用前端模块化编程的思想,继续学习Vue框架,完成自己项目项目的搭建。 目录 响应式基础 ref reactive 学习成果展示 Vue项目搭建 搭建自己的vue项目 总结  关于ref和reactive,官方解释如下,另外一

    2024年02月12日
    浏览(53)
  • 使用Webpack进行模块化开发与打包

    Webpack是一个现代化的JavaScript模块打包工具,它可以将多个模块打包成一个或多个静态资源文件。通过Webpack,我们可以将项目中的各个模块进行模块化开发,并将它们打包成一个或多个可供浏览器加载的静态资源文件。 使用Webpack进行模块化开发与打包有以下几个优势: 2.1

    2024年02月12日
    浏览(72)
  • 【Unity】程序集Assembly模块化开发

    笔者按:使用Unity版本为2021.3LTS,与其他版本或有异同。请仅做参考 一、简述。 本文是笔者在学习使用Unity引擎的过程中,产学研的一个笔记。由笔者根据官方文档Unity User Manual 2021.3 (LTS)/脚本/Unity 架构/脚本编译/程序集定义相关部分结合自身经验所做,有不足之处,还请指正

    2024年02月15日
    浏览(64)
  • LabVIEW应用开发——VI模块化

            我们在写C语言的时候,一些模块化的功能或者多次调用的功能,我们一般会用一个函数封装起来,方便使用并且让代码看起来更加的简洁。这种函数一般都会包含这几个概念, 输入参数 、 输出参数 和 返回值 。而LabVIEW的VI就可以当作是一个函数, 输入参数 就是

    2024年02月07日
    浏览(51)
  • Python面向对象编程,实现模块化开发

    面向对象编程(Object Oriented Programming,OOP)是一种编程范式,它将真实世界中的事物抽象成程序中的对象,并通过对象之间的相互作用来完成程序的逻辑。 封装 (Encapsulation) 封装是指把数据和行为结合成一个相对独立的整体,防止程序中其他部分直接访问或修改这个整体,而

    2024年02月05日
    浏览(142)
  • TIMC 驱动的模块化区块链 Axiomesh:致力于构建「Mass Commercial Adoption」新范式

    撰文:JIN,Techub News 在区块链技术的演进历程中,我们正见证历史性的转折点:「Mass Adoption」即区块链的大规模普及,指的是区块链技术从封闭的小范围应用扩展到广泛的行业和市场的过程。它是区块链技术跨越早期采用者的界限,渗透到普通消费者生活的每个角落,成为

    2024年03月24日
    浏览(48)
  • 第三章认识Node.js模块化开发

    目录 认识Node.js 概述 作用 基本使用 Node.js的运行 Node.js的组成 Node.js的语法 Node.js全局对象 认识模块化开发 概述 场景 特点 模块成员的导入和导出 Node.js 模块化语法 导入模块 导出模块 ES6 模块化语法 导入模块 导出模块 项目 认识Node.js 概述 Node.js是一个 开源的、跨平台 的

    2024年02月06日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包