相关文章
树莓派linux led字符设备驱动
2024-11-10 17:08

目录

树莓派linux led字符设备驱动

1、开发环境搭建

1.1 确定树莓派linux版本

1.2 获取内核源码,交叉编译工具链和固件

1.3 编译前的准备

1.4 开始编译

2、参考树莓派博通芯片数据手册

2.1、查看树莓派 BCM2837 ARM 手册

2.2、查看树莓派GPIO地址映射基地址

3、树莓派GPIO寄存器操作

驱动代码

 测试代码led_app.c

编译测试代码 :


开发环境系统ubuntu 16(64位,在PC上安装虚拟机。

1.1 确定树莓派linux版本

 

如上图可知,我的Raspber Pi系统为Linux raspberrypi 4.19.75-v7+ 版本。这一点很重要,将决定需要编译的内核版本。

1.2 获取内核源码,交叉编译工具链和固件

树莓派官方将树莓派相关的大部分资源都放在了GitHub上,所以只需再GitHub的相应板块找到即可,链接地址为:https://github.com/raspberrypi

新建路径 ~/Raspberry/,下载

(1)Linux:树莓派内核源码:https://github.com/raspberrypi/linux/tree/rpi-4.19.y,直接下载zip,然后上传到ubuntu系统或者执行命令git clone --depth=1 --branch rpi-4.19.y https://github.com/raspberrypi/linux)下载分支

注意:要下载系统对应的源码,我现在系统是4.19.75-v7+,所以下载4.19.y。

(2)tools:树莓派的交叉编译工具,,链接地址:https://github.com/raspberrypi/tools/tree/master/arm-bcm2708 如下图

如上图可见tools的路径,找到相应交叉编译工具链,可知树莓派官方提供了3种交叉编译工具链(最下方的是同一个工具链,只是针对32bit系统和64bit系统做了区分),先将其克隆下来。

命令: git clone https://github.com/raspberrypi/tools

 

此目录下有5个目录,是不同版本的交叉编译工具。其中arm-rpi-4.9.3-linux-gnueabihf和gcc-linaro-arm-linux-gnueabihf-raspbian-x64是64位机器用的。每一个交叉编译工具的目录下都有bin目录进入,执行https://blog.csdn.net/qq_43176116/article/details/arm-linux-gnueabihf-gcc -v可查看gcc版本。这里我使用arm-rpi-4.9.3-linux-gnueabihf,因为目前板子上的gcc版本是4.9.3

1.3.获取当前树莓派系统的配置文件

这里很有必要说明是,在raspberrypi系统的3.x版本以前,树莓派系统默认存在/proc/config.gz文件,但是更新到4.x版本之后,/proc/config.gz文件默认不存在了,所以我们需要先获取到这个文件。执行命令

 

执行以上命令之后,会在/proc/目录下生成config.gz文件。然后将此文件从树莓派系统内拷贝到我们的PC平台(有很多种方法,比如U盘,NFS系统文件共享,TCP,samba等等)。然后在需要编译的内核的顶层目录下执行命令

 

目的是生成.config配置文件

1.3 编译前的准备

(1)确定树莓派系统内的编译器版本。

使用命令 cat /proc/version查询树莓派系统的编译器的 版本号。如下图

 

如上图所知,gcc编译器的版本号为4.9.3版本如果以下交叉编译工具的版本不是4.9.3,需要改成4.9.3版本,并且更新时间为 2019 年 9 月 24 日。

(2)选择编译工具链的版本,因为下载到的交叉编译工具链有三个版本,所以应该选择其中一个,但是考虑到版本的匹配问题(如果编译器的版本和原有系统的版本不一样的话,有可能会出现一些莫名奇妙的问题,特别是在开发驱动时)。下面查看各个编译器的版本。

arm-bcm2708hardfp-linux-gnueabi编译器:切换到tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/目录下

使用命令:https://blog.csdn.net/qq_43176116/article/details/arm-bcm2708hardfp-linux-gnueabi-gcc –v

如上图可见此编译器为4.7.1版本,并且也能看到更新的时间。但是版本比现有系统的版本要低了。

arm-bcm2708-linux-gnueabi编译器:切换到tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/目录下

使用命令:https://blog.csdn.net/qq_43176116/article/details/arm-bcm2708-linux-gnueabi-gcc –v

如上图可见,此编译器也为4.7.1版本,只是更新时间不同。

gcc-linaro-arm-linux-gnueabihf-raspbian编译器:切换到tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/目录下

使用命令:https://blog.csdn.net/qq_43176116/article/details/arm-linux-gnueabihf-gcc –v

如上图可见,此编译其为4.8.3版本,并且更新时间为20140106.并且适用于32bitPC平台。

再看gcc-linaro-arm-linux-gnueabihf-raspbian-x64 编译器:切换到tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/目录,使用命令:https://blog.csdn.net/qq_43176116/article/details/arm-linux-gnueabihf-gcc –v

如上图,可知此版本的编译器和莓派系统的编译器版本是最相近的一个版本,所以理当使用它进行编译。不过呢这是64bit PC平台的编译器,如果是32为平台的电脑,使用gcc-linaro-arm-linux-gnueabihf-raspbian编译器即可。

(3)安装编译工具链

加入环境变量

 

编辑内容

 
 

测试交叉编译工具测试环境变量是否配置好

 

将工具链添加到Makefile中。

切换到所编译内核的顶层目录,并打开目录下的Makefile文件,修改如下图:本例为: vi Makefile +313 

直接添加了绝对路径的交叉编译工具链

1.4 开始编译

安装依赖

 

 cd 至 linux 源码文件夹下

 

 将SD卡插入读卡器,插入电脑,在虚拟机读取SD卡。在/media/liang/ 目录下会出现两个目录 boot/ rootfs/

执行命令

 

将SD卡插回树莓派,重新启动树莓派,查看系统版本变成了 4.19.127-v7+ ,则成功更新了内核,后面就可以使用源码来编写树莓派驱动了。

2.1、查看树莓派 BCM2837 ARM 手册

BCM2837ARM Peripherals 数据手册(chrome-extension://cdonnmffkdaoajfknoeeecmchibpmkmg/assets/pdf/web/viewer.html?file=https%3A%2F%2Fcs140e.sergio.bz%2Fdocs%2FBCM2837-ARM-Peripherals.pdf

page 6 中可得到外设物理地址为 0x3F000000 0x3FFFFFFF 外设物理地址 0x3Fnnnnnn 映射到内存地址 0x7EnnnnnnGPIO的偏移量 0x2000000 ,所以GPIO的物理地址应该是从 0x3f200000 (查看Page 90)开始的

note特别注意,BCM2708 和BCM2709 IO起始地址不同,BCM2708是0x20000000,BCM2709是0x3f000000,这是造成大部分人驱动出现“段错误”的原因。树莓派3B的CPU为BCM2709。

2.2、查看树莓派GPIO地址映射基地址

方法一

 

结果  3f200000-3f2000b3 : /soc/gpio@7e200000。3f200000为基地址,有的系统却显示 00000000-00000000 : /soc/gpio@7e200000

方法二

 

Page 90 罗列出 GPIO的各种寄存器地址和功能描述。

本节关心 GPIO功能选择寄存器(GPFSELn:FSEL {n}字段确定第n个GPIO引脚的功能, 所有未使用的复用功能线接地并且输出“ 0”。复位后 所有引脚为正常的GPIO输入。从Page 91可看出一个 GPFSELn 寄存器控制 10个GPIO口,并且每 3bit 控制一个GPIO口。本文配置为输出即为 001。

GPIO输出置位寄存器 (GPSETn ):SET {n}字段定义要设置的相应GPIO引脚,向该字段写入“ 0”无效。 如果GPIO引脚被用作输入(默认情况下,则SET {n}字段中的值将被忽略。 但是,如果随后将引脚定义为输出,则将根据最后的置位/清除操作来设置该位。 分开设置和清除功能,无需进行读-修改-写操作。Page 95:GPSET0 控制 GPIO0~31,GPSET1 控制 GPIO32~53(向某位写 1 置位

GPIO输出清零寄存器(GPCLRnCLR {n}字段定义要清除的相应GPIO引脚,向该字段写入“ 0”无效。 如果GPIO引脚被用作输入(默认情况下,则CLR {n}字段中的值将被忽略。 但是,如果随后将引脚定义为输出,则将根据最后的置位/清除操作来设置该位。 分开设置和清除功能,消除了对读取-修改-写入操作的需求。Page 95:GPCLR0 控制 GPIO0~31,GPCLR1 控制 GPIO32~53(向某位写 1 清零

Page 102 说明了 54个GPIO 除基本的输入输出功能外另外的六种复用功能。

树莓派40Pin 引脚对照表| 树莓派实验室

本文使用到树莓派的 GPIO26 即为 BCM编码的26,功能名:GPIO.25

 

 测试代码led_app.c

 

编译测试代码 :

 

在虚拟机分别编译,将模块拷贝至树莓派 /lib/modules/4.19.127-v7+/ 文件夹、测试程序拷贝至树莓派 任意 文件夹

 

    以上就是本篇文章【树莓派linux led字符设备驱动】的全部内容了,欢迎阅览 ! 文章地址:http://sjzytwl.xhstdz.com/news/1647.html 
     栏目首页      相关文章      动态      同类文章      热门文章      网站地图      返回首页 物流园资讯移动站 http://sjzytwl.xhstdz.com/mobile/ , 查看更多   
最新文章
手机摄影技巧手机摄影「手机摄影技巧」
手机摄影技巧:  1.了解摄影的基本元素光(顺光、侧光、顶光、逆光、黄金时段)   光是摄影的生命。有了光,万物才有了可以被
已预定x200 pro mini,分享下我的换机原因我手机「已预定x200 pro mini,分享下我的换机原因」
线下有优惠所以在线下订了,只能订512的,已经跟导购说要1t的了,到时如果没有1t的就再等等。为什么选这个机子?先说说我的用机
为什么你的外卖“烧钱”推广还是没单量?手机搜狐网「为什么你的外卖“烧钱”推广还是没单量?」
美团的竞价推广产品很多,到底我该怎么选推广产品?烧钱的速度很快,可是烧不出来几单,投入产出比极低?高度依赖推广,推广一停
“在我的手机里”是 in my phone 还是 on my phone?(音频版)我手机「“在我的手机里”是 in my phone 还是 on my phone?(音频版)」
↓↓↓点击下方卡片,发现更多精彩↓↓↓英语口语·吉米老师说“手机”的英语是 phone,那“照片在手机里”是用 in the phone 还
四十年,最具“先锋精神”的四十位作家手机搜狐网「四十年,最具“先锋精神”的四十位作家」
四十年是中国巨变的四十年,也是中国文学蓬勃发展、大浪淘沙的四十年,新时期文学尤以先锋文学成就为最;一直秉承“先锋精神”的
Photoshop的新“超分辨率”功能使图像更大,而不模糊手机搜狐网「Photoshop的新“超分辨率”功能使图像更大,而不模糊」
升级数码照片通常会破坏其图像质量。在将丑陋的对象(称为工件)添加到文件中时,您会失去细节和清晰度,从而使整个图像显得松脆
哪种最好用? 车载手机支架选购使用指南车载手机支架「哪种最好用? 车载手机支架选购使用指南」
汽车点评网3月25日报道 手机在车内的固定方式一直是开车人比较头疼的问题,尤其是现在智能手机的导航软件瞬秒原厂导航;所以大多
为手机加速 百度手机助手5.3推出带“特权”新版百度手机助手app下载「为手机加速 百度手机助手5.3推出带“特权”新版」
“这手机简直不能忍了,慢得像蜗牛一样”,“手机太慢,刷个贴吧、微博、微信也要等半天”,“要是不是手机慢,今天我就抓怕到身
古人对书房的那些昵称手机搜狐网「古人对书房的那些昵称」
古人的书房昵称 自古及今,书房并无一定之规。富者可专门筑楼,贫者或室仅一席;有的雕梁画栋,有的则环堵萧然。书房或筑于水滨
供电制冷,液冷散热,华为Mate 60 散热手机壳体验华为手机壳「供电制冷,液冷散热,华为Mate 60 散热手机壳体验」
前言随着华为Mate 60系列手机的面世,愈来愈多的配件可供用户选择,上期,充电头网就对华为上架的该系列手机散热能力的手机壳进
相关文章