linux驱动-GPIO借鉴文章

Linux的platform设备驱动框架 前面我们讲了设备驱动的分离,并且引出了总线(bus)、驱动(driver)和设备(device)模型,比如 I2C、SPI、USB 等总线。但是在 SOC 中有些外设是没有总线这个概念的,但是又要使用总线、驱动和设备模型该怎么办呢?为了解决此问题,Linux 提出了 platform 这个虚拟总线,相应的就有 platform_driver 和 platform_device。这里的设备和驱动要怎么理解呢?设备是硬件设备的抽象表示。每个设备都有一个设备名称和一组功能。 阅读详情
今天完成了嵌入式linux的第一个驱动的编写和测试,虽然是个简单的程序,但是麻雀虽小,五脏俱全,希望可以给刚开始接触驱动编写的人一些提示,共同进步。源代码:分析如下: 下面是我的驱动程序:#include //配置头文件#include /*内核头文件,作为系统核心的一部分,设备驱动程序在申请和释放内存时,不是调用malloc和free,而是调用kmalloc和kfree*/#include //调度,进程睡眠,唤醒,中断申请,中断释放#include //时钟头文件#include //用户定义模块初始函数名需引用的头文件#include //模块加载的头文件#include #include //这个是2440的寄存器头文件,asm/srch只是个链接//实际根据自己的情况查找,一般是../../linux2.*.*/include/asm/arch-s3c2440里 编译器//自己会查询链接,以前不知道,找了半天// GPIO_LED DEVICE MAJOR#define GPIO_LED_MAJOR 97 //定义主设备号//define LED STATUS 我的板子 LED在GPB0 与GPB1 处 大家根据自己情况改 #define LED_ON 0 //定义LED灯的状态 开#define LED_OFF 1 // // ------------------- READ ------------------------ 这个前面要加static 否则警告static ssize_t GPIO_LED_read (struct file * file ,char * buf, size_t count, loff_t * f_ops){return count;} // ------------------- WRITE -----------------------static ssize_t GPIO_LED_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops){return count;} // ------------------- IOCTL -----------------------static ssize_t GPIO_LED_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, long data) //这个函数实现了led灯亮灭的接口{switch (cmd){case LED_ON : { GPBDAT =0x01; break;} //根据自己情况修改 一个亮 一个灭 case LED_OFF: { GPBDAT =0x02; break;} //交替闪烁default :{printk ("lcd control : no cmd run [ --kernel-- ]\n"); return (-EINVAL);}}return 0;}// ------------------- OPEN ------------------------static ssize_t GPIO_LED_open (struct inode * inode ,struct file * file){MOD_INC_USE_COUNT;return 0;} // ------------------- RELEASE/CLOSE ---------------static ssize_t GPIO_LED_release (struct inode * inode ,struct file * file){MOD_DEC_USE_COUNT; return 0;}// -------------------------------------------------struct file_operations GPIO_LED_ctl_ops ={ open: GPIO_LED_open, //这段赋值代码必须放在接口函数申明之后read: GPIO_LED_read, //否则编译不过去 write: GPIO_LED_write,ioctl: GPIO_LED_ioctl,release: GPIO_LED_release,}; // ------------------- INIT ------------------------static int GPIO_LED_CTL_init(void){int ret = -ENODEV; printk("--------------------------------------------\n\n");GPBCON = 0x0005; // 设置端口为I/O输出模式GPBUP = 0xff; // 关闭上拉功能GPBDAT = 0xf; //初始值为高电平熄灭LED灯 ret = register_chrdev(GPIO_LED_MAJOR, "gpio_led_ctl", &GPIO_LED_ctl_ops); //这个驱动注册函数必须放在复制接口的那个结构体之后 if( ret < 0 ){printk (" S3C2410: init_module failed with %d\n", ret); return ret;}else{printk("S3C2410 gpio_led_driver register success!!! \n");}return ret;}static int __init S3C2410_GPIO_LED_CTL_init(void){int ret = -ENODEV;ret = GPIO_LED_CTL_init();if (ret)return ret;return 0;}static void __exit cleanup_GPIO_LED_ctl(void){unregister_chrdev (GPIO_LED_MAJOR, "gpio_led_ctl" );}module_init(S3C2410_GPIO_LED_CTL_init);module_exit(cleanup_GPIO_LED_ctl);完了编译这个驱动函数makefile如下:################################################## config# where the kernel sources are located 这是我的内核头文件的路径 根据自己的修改KERNEL_DIR := ../../../linux-2.4.20 ################################################## some magic for using linux kernel settings# when compiling module(s)# for new-style kernel Makefiles (2.4)export-objs := led.o //要编译好的对象list-multi :=obj-m := led.o here:(cd $(KERNEL_DIR); make SUBDIRS=$(PWD) modules) //makeclean:-rm -f *.o .*.o.flags *~include $(KERNEL_DIR)/Rules.make //make的规则 根据自己的情况修改编译好以后,接下来就是测试是否可以使用驱动了测试函数如下:#include #include #include #include // open() close()#include // read() write()#define DEVICE_NAME "/dev/gpio_led_ctl" //这是设备驱动名字,一会要建立//define LED STATUS#define LED_ON 0#define LED_OFF 1//------------------------------------- main ---------------------------------------------int main(void){int fd;int ret;char *i; printf("\nstart gpio_led_driver test\n\n"); fd = open(DEVICE_NAME, O_RDWR);printf("fd = %d\n",fd); if (fd == -1){printf("open device %s error\n",DEVICE_NAME);}else{while(1){ ioctl(fd,LED_OFF); //GPB0亮 GPB1灭sleep(1); //等待1秒再做下一步操作 ioctl(fd,LED_ON); //反过来 sleep(1); }// closeret = close(fd);printf ("ret=%d\n",ret);printf ("close gpio_led_driver test\n");} return 0;}// end mainmakefile如下:CROSS = /opt/host/armv4l/bin/armv4l-unknown-linux- //交叉编译工具路径 根据自己修改CC = $(CROSS)gccAR = $(CROSS)arSTRIP = $(CROSS)stripEXEC = test //生成的可执行文件OBJS = test.oall: $(EXEC)$(EXEC): $(OBJS)$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBM) $(LDLIBS) $(LIBGCC) -lm //编译clean:-rm -f $(EXEC) *.elf *.gdb *.o接下来就是最后的调试了:首先把生成的led.o和test载到板子上然后:insmod led.o //成功的话,会打印sucesslsmod //查看内核里面是否已经有led驱动模块mknod /dev/gpio_led_ctl c 97 1 //新建LED的测试设备节点,给test.c使用// /dev/gpio_led_ctl 是打开的设备名称,要和测试代码匹配 // c代表字符设备// 97是主设备好,与驱动程序匹配 1是从设备号 只有一个选1最后执行:./test //成功了会打印一些 信息 这是你会看到你的板子上 LED交替亮灭 间隔1s补上一点“/opt/FriendlyARM/mini2440/linux-2.6.29/arch/arm/plat-s3c24xx/include/plat/map.h这个是linux2.6.69内核下的24X0寄存器定义头文件,里面定义了特殊功能寄存器的PA向VA的映射。记在这里,免得以后又找不到了。在2.6.29上,S3C24xx相关的头文件存放于下面这些目录中arch/arm/mach-s3c2410/includearch/arm/mach-s3c2400/includearch/arm/mach-s3c2412/includearch/arm/mach-s3c2440/includearch/arm/mach-s3c2442/includearch/arm/mach-s3c2443/includearch/arm/plat-s3c24xx/includearch/arm/plat-s3c/include例如:s3c2410_gpio_cfgpin为什么是 S3C2410 的呢?因为三星出品的 S3C2440 芯片所用的寄存器名称以及资源分配大部分和 S3C2410 是相同的,在目前各个版本的 Linux 系统中,也大都采用了相同的函数定义和宏定义。它们从哪里定义?细心的用户或许很快就想到它们和体系结构有关,因此你可以在linux-2.6.32.2/arch/arm/mach-s3c2410 /include/mach/hardware.h 文件中找到该函数的定义,关于该函数的实际实现则可以在 linux-2.6.32.2/arch/arm/plat-s3c24xx/gpio.c 中找到,
输入子系统(3):按键驱动实现 1:概述 按键驱动实现的过程,主要完成:input_dev的申请和注册,按键中断的实现,中断底半部的实现,在中断底半部调用事件上报函数,完成按键键值的上报;如果增加按键防抖,需要实现一个内核定时器。本文主要分析的是内核中的gpio_keys.c的文件,这是内核提供的参考,我们就借鉴这个文件,来实现我们的按键驱动,首先,看看内核中已经实现的和按键驱动有关的数据结构; 2:和按键相关的数据结构 阅读详情

相关推荐

微信抢红包神器自动抢软件

微信抢红包神器自动抢软件

weixin_44006731的博客 8080

关于使用platform和file_operations开发驱动的不同

最近在看2.6.22内核中自带的led驱动,使用platform的方式写的,platform的设备和驱动匹配的过程可以在网上找到资料。通过对platform驱动框架的了解能够知道整个led的驱动的入口函数是leds_s3c24xx.c中的s3c24xx_led_probe函数,可是翻遍了整个文件都没有看到有定义file_operations结构体,那么就产生了如何使用这个驱动的疑问。翻了很多资料都

FF的专栏 1979

OpenFOAM-多孔介质模型(porous media)

文章目录一、多孔介质(porous media)二、使用步骤1.达西定律2.Darcy-Forchheimer3.OpenFOAM fvOptions4.paraview动画每帧显示时间(Annotate Time)5.参考内容总结 一、多孔介质(porous media) 在流体力学中,流体流经多孔介质是指流体流经多孔介质时的行为方式,如海绵或木材,或使用沙子或其他多孔材料过滤水。 我们将展示如何设置多孔层,并使用OpenFOAM模拟流体通过该介质。 二、使用步骤 1.达西定律 达西定律最初是由达西通.

zq93538196的博客 9938

浅析debugfs文件系统调试阶段gpio使用范例

浅析debugfs文件系统调试阶段gpio使用范例=========================================================================================我们对debugfs文件系统的应用之1是:drivers/gpio/gpiolib.c它创建了一个名为"gpio"的文件,然后我们可以使用'-'表示o...

weixin_34294649的博客 224

SecureCRT多种配色方案配置文件

位置 C:\Users%USERNAME%\AppData\Roaming\VanDyke\Config\Global.ini S:"SecureCRT Tab State"=1,1,1,0,0 S:"SecureFX Local Tab State"=1,-1,200 D:"Max Chat Window History"=000000c8 D:"Active Window Alpha Transparency"=000000f0 D:"Save Keymaps As Unicode"=00000000

神棍之路 3710

Ruoyi-Cloud-Plus新手必看:Gateway启动失败的两种解决方案(Nacos配置空间问题)

本文详细解析了Ruoyi-Cloud-Plus框架中Gateway启动失败的常见原因及解决方案,重点围绕Nacos配置空间问题展开。针对新手开发者,提供了两种实用方案:快速切换到public空间或规范创建dev空间并迁移配置,帮助开发者高效解决网关启动故障,确保微服务项目顺利运行。

weixin_30872499的博客 492

全志A20控制GPIO口的一种方法:

全志A20控制GPIO口的一种方法: 1、驱动模块文件:a20_gpio.c // printk(KERN_ERR "****wyb %s:%d/%s()!\n", __FILE__, __LINE__, __func__); // http://blog.youkuaiyun.com/mirkerson/article/details/8844997 // android驱动

南岭笑笑生之家 8828

基于FFT的轴承故障诊断 - MATLAB代码和详细解释

最后,我们可以根据异常特征的位置和特征分析来确定轴承故障的类型。最后,我们可以根据异常特征的位置和特征分析来确定轴承故障的类型。因此,通过分析频谱图,我们可以识别轴承故障的特征。因此,通过分析频谱图,我们可以识别轴承故障的特征。我们可以选择适当的阈值,并在频谱图上标记异常特征。通过这种基于FFT的轴承故障诊断方法,我们可以快速、准确地检测和诊断轴承故障。接下来,我们将应用FFT来获取振动信号的频谱信息,频谱显示了信号在不同频率上的能量分布。通过将异常特征标记在频谱图上,我们可以直观地识别轴承故障的存在。

COWizard的博客 613

《Linux驱动》GPIO配置并操作Led

驱动代码:#include <linux/init.h> #include <linux/module.h>/*驱动注册的头文件,包含驱动的结构体和注册和卸载的函数*/ #include <linux/platform_device.h> /*注册杂项设备头文件*/ #include <linux/miscdevice.h> /*注册设备节点的文件结构体*/ #include <linux/fs.h

学编程找莫离,莫离老师更懂你! 2868

x265开源编码器源码框架深度解析

x265开源编码器源码框架深度解析

世界那么大,我想去看看~【随心更新,看世界去了😄】 669

基于YOLOv8的应急通道占用监测系统设计与实现

通过详细的数据集选择、模型训练、代码实现等内容,本博客为您提供完整的系统搭建过程,帮助您构建高效的监测系统。然而,在一些建筑物和公共场所中,应急通道经常被不当占用,导致紧急情况下无法及时使用,严重影响人员的疏散效率。YOLOv8是YOLO系列中的最新版本,它通过引入深度学习的优化和改进,在保证检测速度的同时,显著提升了检测精度。同时,随着深度学习技术的不断发展,检测精度与速度的提升将使得该系统在更广泛的场景中应用。:如果已有监控设备,可以采集应急通道的实时视频,并进行标注,生成占用监测数据集。

YOLO 797

嵌入式Linux(三)模仿STM32驱动开发

111

qq_41075961的博客 475

实战篇| app爬虫不用真机

之前写过一篇基于真机app爬虫《App爬虫实战篇-以华为真机手机爬取集换社的app为例》,如果大家有用真机爬虫的经历,会深刻认识到真的不方便,一是自己的手机,经常会被电话、微信等打断,二是闲置手机,面对小批量数据还能勉强,大批量爬虫,会导致成本指数级上升,并且控制起来相对麻烦。以下就是常见的模拟器。emulator -avd my_avd -no-snapshot-save # 启动时不保存 snapshot。emulator -avd my_avd -wipe-data # 清除数据(恢复到出厂)

youbingchen的博客 597

Linux驱动编程篇(五)——驱动设计的思想(面向对象)(分层)(分离)

Liunx驱动 = 驱动框架 + 硬件操作 ===》Liunx驱动 = 驱动框架 + 单片机

阿——波罗的博客 1180

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

基于Jetson Agx Xavier的驱动开发----------一个字符设备驱动(多设备驱动)

文章目录前言一、字符设备驱动开发的主要流程?二、驱动程序的编写1.驱动程序的组成2.驱动入口函数总结 前言 这段时间学习驱动开发,手里只有一块jetson开发板,但是所有驱动开发教程都是针对于特定的学习板,针对于jetson开发板没有,虽然他们的开发流程可以借鉴,但是有许多地方不一样,在此记录一下开发流程和踩到的坑,如需具体理论知识,请参考正点原子的驱动开发教程/顺便提一嘴,之前以为正点原子只是在裸板开发上的教程特别好,这段时间看了他们嵌入式linux驱动开发指南,不得不说,是真的好,建议小白去学习一下.

weixin_44927463的博客 1547

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Linux驱动开发笔记(三)平台设备驱动

随着科技的飞速发展,平台设备已成为现代计算机系统不可或缺的重要组成部分。无论是智能手机、平板电脑,还是嵌入式系统、数据中心服务器,平台设备都承载着系统运行的核心功能。因此,平台设备驱动的开发与优化,对于保障系统稳定性、提升性能以及满足用户日益增长的需求具有至关重要的作用。在接下来的章节中,我们将详细介绍该驱动的设计思路、实现原理、功能特性以及使用方法,希望能够为广大读者提供有价值的参考和借鉴。//定义一个resource结构体,用于存放上述的寄存器地址,提供给驱动使用。

sincerelover的博客 2003

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ITOP4412----基于4.19.99Linux内核的4.3寸显示屏驱动(一)

参考:排名不分先后顺序 1、设备树学习之(十二)LCD驱动 2、exynos4412 的FIMD 介绍 3、Exynos4412——LCD驱动 4、【TINY4412】LINUX移植笔记:(27)设备树LCD驱动 本人使用的开发板为itop4412开发板,因为官方提供的Linux4.14的内核并没有提供4.3寸LCD屏的设备树和驱动,但是直接烧录镜像发现屏幕是可以被点亮的,萌发移植lcd驱动的念头。对于移植来说,无论哪家的开发板,同一个soc,片上外设情况都是相同的,可以借鉴。 开始移植 移植的时候,搜索了

JC_gogo的博客 2204

01-入门简介【Linux驱动速通学习】

本文介绍了学习Linux驱动开发的重要性,从底层抽象思维、系统架构视角、模块化设计等方面阐述了驱动开发的价值。文章解析了Linux驱动的核心概念"机制与策略",并详细分类了字符设备、块设备和网络接口等设备类型,通过类比和实例说明其特点。最后作者分享了对嵌入式技术的热爱,呼吁读者关注支持相关内容。全文150字,概括了Linux驱动开发的核心要点和学习意义。

zhuzhu的博客 601

beaglebone black led 混杂设备驱动

这篇文章展示如何在BBB平台上编写LED驱动程序,本文的程序是根据国嵌S3C2440的LED驱动的例子并结合内核中OMAP系列的gpio操作来改的。本文中的程序包括驱动程序模块和用户空间程序。废话不多说,先贴程序出来吧。 /**************************************************** am3359_leds_misc.c *******

3125

Linux驱动-设备树插件语法

如果你对设备树已经了解,就能解决工作上决绝大多数设备数相关问题,这里了解一个新的知识点,设备树相关的知识:设备树插件设备树插件(Device Tree Overlay)是Linux设备树机制的扩展,允许在不修改原始设备树(DTB)的情况下动态添加或修改设备节点。主要特点动态性:可以在系统运行时加载和卸载模块化:将硬件配置分解为可管理的部分非侵入式:不需要重新编译整个设备树可重用性:同一插件可用于不同平台设备树插件基本语法首先添加插件头部声明/dts-v1/;/plugin/;

十年饮冰,难凉热血 846

【目录】博客文章总目录一览

前言:开始工作后,会使用到很多模块、各种初始化配置,但是便于快速学习和使用常见的一些模块和外设的配置,将自己使用过的STM32教程汇总,方便自己以后更快的查找资料,以及大家学习与查找,虽然自己也已经工作有段时间了,但感觉自己还是在入门阶段,但这些内容和经验只有使用过,真心的区总结,才能在这个过程中得到成长,自己也超过许多的资料,但是很多资料都是描述不够清楚,可能只有自己能够看懂,因此便于自己和大家的学习和借鉴,会以一个使用者的角度,去撰写博客,希望能够给到自己更清楚的解释和方便,同时也能够帮助大家答疑解惑。

Hei_se_meng_yan的博客 934

linux(第十三期)--按照STM32驱动开发的格式来编写I.MX6U寄存器的驱动-- Ubuntu20.04

按照STM32驱动开发的格式来编写I.MX6U寄存器的驱动

博主发布的博客主要分布在:​ 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》《linux裸机开发专栏》 《freertos专栏》《STM32 HAL库专栏》 《ROS开发专栏》 ​《产品测评专栏》《Ai智能体专栏》 1264

RK3568设备树驱动开发实战:从语法解析到OF函数应用

本文深入解析了RK3568平台Linux设备树驱动的开发全流程。从设备树语法基础、核心属性详解,到实战演练为I2C总线添加传感器节点,并系统介绍了驱动代码中如何通过OF函数读取设备树信息。内容涵盖RK3568设备树开发必备知识、常见问题排查与避坑指南,旨在帮助开发者高效掌握这一现代Linux驱动开发的基石技术。

u6v7w8x的博客 860

linux很简单,linux入门很简单

《Linux入门很简单》是清华大学出版社2012年3月22日出版的图书。该书是一本与众不同的Linux入门读物。作者借鉴历史畅销书《明朝那点事儿》的写作风格,将技术图书以风趣幽默的风格娓娓道来,阅读起来十分过瘾。书中以一个拟人化的Ubuntu操作系统为主角,以Ubuntu10.04为基础,讲解了Ubuntu系统从安装、配置,到搭建开发平台、投入使用的过程。不过本篇文章并不是分享这本书,我写这篇文章...

weixin_31851979的博客 483

关于Linux

<br />这篇文章来自网络。<br /> <br />由于很多人总问这个问题,所以这里做一个总结文档供大家参考。这里必须先说明,以下的步骤都是针对Linux系统的,并不面向WinCE。也许你会注意到,现在做嵌入式的人中,做linux研究的人远比做WinCE的人多,很多产家提供的资料也是以linux为主。我一直很难理解,其实WinCE的界面比linux的界面好看多了,使用起来也很方便,更为重要的是,WinCE的开发和Windows下的开发基本一样,学起来简单得多,但是学linux或者使用linux做嵌入式的

GhostTigerMan 1248

Android高通平台调试Camera驱动全纪录

项目比较紧,3周内把一个带有外置ISP,MIPI数据通信,800万像素的camera从无驱动到实现客户全部需求。 1日 搭平台,建环境,编译内核,烧写代码。 我是一直在Window下搭个虚拟机登服务器搞开发的,对Linux系统环境实在无爱,每每一到项目刚开始要搭环境了,内心总有点排斥,过程就比较纠结,看来以后还是要搞个linux真机玩玩。 2日 编写camera驱动大致框

Winston 5893
上一篇: 内核模块Makefile
下一篇: S3C2440 LED驱动
luxiefly
博客等级 码龄16年 7粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值