Linux + ARM
文章平均质量分 65
Linux + ARM
执念、坚持
坚持记录自己的成长
展开
-
GPIO && Pinctrl 子系统
大多数的芯片,没有单独的 IOMUX 模块,引脚的复用、配置等等,就是在GPIO 模块内部实现的。Pinctrl 系统的客户,那就是使用 Pinctrl 系统的设备,使用引脚的设备。现在的芯片动辄几百个引脚,在使用到 GPIO 功能时,让你一个引脚一个引脚去找对应的寄存器,这要疯掉。所以为了更方便驱动工程师的开发,要把引脚的复用、配置抽出来,做成 Pinctrl 子系统,给 GPIO、I2C 等模块使用。比如默认状态下, UART 设备是工作的,那么所用的引脚就要复用为 UART 功能。原创 2024-07-29 23:21:15 · 576 阅读 · 0 评论 -
查询方式的按键驱动程序_编写框架
对于 LED,APP 调用 open 函数导致驱动程序的 led_open 函数被调用。安装驱动程序后并不意味着会使用对应的硬件,而 APP 要使用对应的硬件,必须先调用 open 函数。APP 继续调用 write 函数传入数值,在驱动程序的 led_write 函数根据该数值去设置 GPIO的数据寄存器,从而控制 GPIO 的输出电平。按键没被按下时,上图中左边的 GPIO 电平为高,右边的 GPIO 电平为低。按键被按下后,上图中左边的 GPIO 电平为低,右边的 GPIO 电平为高。原创 2024-07-28 22:34:12 · 171 阅读 · 0 评论 -
APP 怎么读取按键值
APP 得到 poll/select 函数的返回结果后,如果确认是有数据的,则再调用 read 函数,这会导致驱动中的 read 函数被调用,这时驱动程序中含有数据,会直接返回数据。APP 调用 fcntl 函数,把驱动程序的 flag 改为 FASYNC,这会导致驱动程序的 fasync 函数被调用,它只是简单记录进程 PID。当用户按下按键时,GPIO 中断被触发,导致驱动程序之前注册的中断服务程序被执行。当用户按下按键时,GPIO 中断被触发,导致驱动程序之前注册的中断服务程序被执行。原创 2024-07-28 21:38:56 · 904 阅读 · 0 评论 -
LED 模板驱动程序的改造:设备树
核心永远是结构体。上述的三种方法,只是指定的硬件资源的方式不一样。原创 2024-07-28 16:03:04 · 679 阅读 · 0 评论 -
内核里操作设备树的常用函数
处理 DTBof_fdt.h // dtb 文件的相关操作函数, 我们一般用不到,// 因为 dtb 文件在内核中已经被转换为 device_node 树(它更易于使用)处理of.h // 提供设备树的一般处理函数// 比如 of_property_read_u32(读取某个属性的 u32 值),// of_get_child_count(获取某个 device_node 的子节点数of_address.h // 地址相关的函数,原创 2024-07-27 22:26:58 · 790 阅读 · 0 评论 -
内核对设备树的处理
如果 of_match_table 中含有 name 值,就跟 dev 的 name 属性比较,若一致则成功,否则返回失败。而设备树中建议不再使用 devcie_type 和 name 属性,所以基本上只使用设备节点的compatible 属性来寻找匹配的 platform_driver。接下来比较。原创 2024-07-27 21:48:46 · 647 阅读 · 0 评论 -
设备树语法基础知识
再来,同一款芯片的板子,它们所用的外设资源都不一样的,比如A板子用到GPIOA,B板用到GPIOB。我们需要编写设备树文件(dts:device tree source),它需要编译为dtb(device tree blob)文件,内核使用的是dtb文件。一旦你需要更换LED 所用到的 GPIO 引脚,需要修改驱动程序源代码,重新编译,重新加载驱动。回想,要操作硬件就需要去操作复杂的寄存器,如果设备树可以操作寄存器,那么它就是“驱动”,它就一样很复杂。的意思就是“机器描述”,学到内核启动流程时才涉及。原创 2024-07-27 15:07:09 · 903 阅读 · 0 评论 -
LED 模板驱动程序的改造:总线设备驱动模型
并且,使用时要先加载 a.ko。原创 2024-07-20 16:19:42 · 234 阅读 · 0 评论 -
驱动进化之路:总线设备驱动模型
最先比较:platform_device. driver_override 和 platform_driver.driver.name。然后比较:platform_device. name 和 platform_driver.id_table[i].name。使用哪个引脚,怎么操作引脚,都写死在代码中。代码稍微复杂,但是易于扩展。,将资源与驱动分离开来。冗余代码太多,修改引脚时设备端的代码需要重新编译。文件,把它传给内核,无需重新编译内核/驱动。无冗余代码,修改引脚时只需要修改。修改引脚时,需要重新编译。原创 2024-07-16 16:46:07 · 688 阅读 · 0 评论 -
驱动设计的思想:面向对象/分层/分离
比如 board_A.c 使用芯片 chipY,那就可以写出:chipY_gpio.c,它实现芯片 Y 的 GPIO操作,适用于芯片 Y 的所有 GPIO 引脚。以面向对象的思想,在 board_A_led.c 中实现 led_resouce 结构体,它定义“资源”──要用哪一个引脚。在 chipY_gpio.c 中仍是实现 led_operations 结构体,它要写得更完善,支持所有 GPIO。使用时,我们只需要在 board_A_led.c 中指定使用哪一个引脚即可。你要去修改上面结构体中的。原创 2024-07-15 22:29:58 · 286 阅读 · 0 评论 -
LED 驱动程序框架
【代码】LED 驱动程序框架。原创 2024-07-15 14:48:56 · 231 阅读 · 0 评论 -
最简单的LED驱动程序
板子没有操作 led 的效果图。函数,驱动层提供自己的。原创 2024-07-09 23:29:16 · 276 阅读 · 0 评论 -
IMX6UL/6ULL的GPIO操作方法
要用CCM_CCGRy 寄存器中的2位来决定该组GPIO是否使能。哪组GPIO用哪个CCM_CCGR寄存器来设置,可以通过上面的红色框部分知道。:General-purpose input/output, 通用的输入输出口。:Clock Controller Module(时钟控制模块):IOMUX Controller , IO 复用控制器。通过查看手册可以得出;原创 2024-07-09 23:14:57 · 312 阅读 · 0 评论 -
普适的 GPIO 引脚操作方法
General-purpose input/output,通用的输入输出口。三个寄存器对应的是同一个物理寄存器;原则:不能影响到其他位。原创 2024-07-06 14:36:55 · 202 阅读 · 0 评论 -
硬件知识 LED 原理图
编写ARM程序时,也应该会有一个像hello一样的程序入门,这个程序就是LED。原创 2024-07-04 22:43:15 · 125 阅读 · 0 评论 -
hello 驱动程序
内核版本:4.x先不解释概念,让hello 驱动程序能跑起来再说。原创 2024-07-04 22:04:28 · 296 阅读 · 0 评论 -
驱动与应用层的交互(输入系统应用编程)
常见的输入设备有键盘、鼠标、遥控杆、书写板、触摸屏等等,用户可以通过这些输入设备与Linux 系统进行数据交换。问题来了?输入设备种类繁多,能否统一它们的接口?既在驱动层面统一,也在应用程序层面统一?可以的。Linux系统为了统一管理这些输入设备,实现了一套能兼容所有输入设备的框架:输入系统。驱动开发人员基于这套框架开发出程序,应用开发人员就可以使用统一的API去使用设备。原创 2024-06-30 18:20:50 · 881 阅读 · 0 评论 -
交叉编译freetype
然后你会看到头文件目录,库目录(LIBRARY_PATH),你需要做的是在头文件目录确定有没有这个文件,或者是自己指定头文件目录。在程序中如果是这样包含的头文件:#include 如果你编译的是一个库,需要把得到的头文件,库文件放入工具链的。运行时不需要头文件,所以头文件不用放到板子上。等目录了,里面有可以执行的程序,库,头文件。,在交叉编译开源软件时,如果它里面有。系统目录:就是交叉编译工具链里的某个。系统目录:就是交叉编译工具链里的某个。这种尖角号里的头文件,去哪里找?原创 2024-06-29 12:11:38 · 967 阅读 · 0 评论 -
ASCII 字符的点阵显示
某位的值为 1 时,表示对应的像素要被点亮;值为 0 时表示对应的像素要熄灭。所以要显示某个字符时,根据它的 ASCII 码在 fontdata_8x16 数组中找到它的点阵,然后取出这 16 个字节去描画 16 行像素。现在要实现显示字符 “A” , 因为有十六行,所以首先要有一个循环 16 次的大循环,然后每一行里有 8位,那么在每一个大循环里也需要一个循环 8 次的小循环。小循环里的判断单行的描点情况,如果是 1,就填充白色,如果是 0 就填充黑色,如此一来,就可以显示出黑色底,白色轮廓的英文字母。原创 2023-11-21 18:35:13 · 307 阅读 · 0 评论 -
Framebuffer 应用编程
驱动程序设置好 LCD 控制器:根据 LCD 的参数设置 LCD 控制器的时序、信号极性;根据 LCD 分辨率、BPP 分配 Framebuffer。APP 使用 ioctl 获得 LCD 分辨率、BPPAPP 通过 mmap 映射 Framebuffer,在 Framebuffer 中写入数据假设需要设置 LCD 中坐标(x,y)处像素的颜色,首要要找到这个像素对应的内存,然后根据它的 BPP 值设置颜色。原创 2023-11-21 14:20:08 · 59 阅读 · 0 评论 -
交叉编译curl库之树莓派
这样,很明显我们需要把这个curl 库的编译工具指定成交叉编译( arm-linux-gnueabihf-gcc),之前是默认使用gcc 的。这个文件肯定是无法放到树莓派上面运行的,我在之前的文章有详细的介绍,包括出现错误的截图、怎么安装交叉编译工具都有记录。因为这个 libcurl 是安装在我电脑虚拟机里面的,编译出来的是适合 x86-64 运行的。以下是在树莓派上运行的结果,我实现的人脸识别拍照的功能。做完上面的步骤,你会发现,你多了一个文件。的内容,这个就让它编译适合。你是无法在虚拟机中运行的。原创 2023-05-15 18:16:40 · 176 阅读 · 0 评论 -
基于OCR实现linux环境中的人脸识别
图像识别靠自己做成比较费劲且识别率不高,故需借助一些工具,我们利用翔云智能平台,百度搜索翔云(因为翔云便宜一些。编译的时候,你会发现无法编译,此时你需要安装openssl库。到此就可以回到人脸识别代码所在文件夹进行编译了。原创 2023-05-12 21:41:41 · 250 阅读 · 0 评论 -
http协议之libcurl的简单使用
libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。libcurl的官网库下载。原创 2023-05-12 15:34:23 · 196 阅读 · 0 评论 -
树莓派下载安装mjpg-streamer
树莓派利用pi Camera模块,通过mjpg-streamer软件获取视频,通过手机端或电脑端浏览实时视频mjpg-streame是一个开源的摄像头的媒体流,他是通过本地获取本地摄像头的数据,再通过http通讯发出来。原创 2023-05-11 22:36:17 · 559 阅读 · 0 评论 -
树莓派之串口通信
使用串口通信API时需要包含头文件:#include , 下面介绍以下常用的API。想要在树莓派中实现串口通信,需要进行一些配置。原创 2023-05-04 12:07:25 · 406 阅读 · 0 评论 -
树莓派之外设开发
WiringPi库(Linux动态库:.so 静态库:.a)API printf(c标准库)树莓派wiringPi库详解树莓派的接口: 驱动IO口:input output 对主控来说Input:人体,烟雾,火焰,震动等Output:继电器,蜂鸣器PWM:电机调速,灯光调明亮度语音识别模块,液晶屏串口uartIICSPIIIS其他特定硬件的接口:flash海思方案,瑞芯微方案,移远方案。原创 2023-05-03 22:50:32 · 57 阅读 · 0 评论 -
数据库-SQLite
轻量化,易用的嵌入式数据库,用于设备端的数据管理,可以理解成单点的数据库。传统服务器型数据库用于管理多端设备,更加复杂。SQLite是一个无服务器的数据库,是自包含的。这也称为嵌入式数据库,这意味着数据库引擎作为应用程序的一部分运行。MySQL需要运行服务器,MySQL将需要客户端和服务器架构通过网络进行交互。原创 2023-04-26 23:15:54 · 79 阅读 · 0 评论 -
树莓派Linux源码目录树分析
cp 厂家.config .config (树莓派1的工程是bcmrpi_defconfig,树莓派2、3的工程是bcm2709_defconfig)真正的生成的Linux内核在源码树目录下 arch/arm/boot 下生成的 " zImage "配置的最终目标会生成.config文件,该文件指导Makefile去把有用东西组织成内核。和最开始的内核版本4.14.98-v7+ 不一致 ,和我们下载的内核版本一致,成功。因为支持多平台,多架构,所以编译之前要配置,配置成适合的目标平台来用。原创 2023-05-05 21:39:14 · 474 阅读 · 0 评论 -
树莓派交叉编译服务端客户端
这个是使用 gcc 编译的,只能放在X86 64 这些平台上面运行。例如,现在把test.c 编译成树莓派 (ARM) 可执行的文件。这个是使用交叉编译工具编译,很明显看到它可以在ARM平台上运行。怎么验证,我分别在虚拟机 和 树莓派中运行这两个文件。原创 2023-05-04 18:48:55 · 52 阅读 · 0 评论 -
树莓派和windows 文件共享
连接上之后,左边windows 右边树莓派, 文件直接拖即可。使用FileZilla 软件。原创 2023-05-02 23:09:10 · 111 阅读 · 0 评论 -
树莓派配置
由于nano 对我来说是在太难用了,我更喜欢vim的命令和界面操作,所以我需要下载一下 vim。由于ip地址是自动获取,可能下一次启动的时候,ip地址就不一样了,这样我们固定一下ip,。同样,页面的终端和字体颜色也是不怎么好看,设置一下即可,方式跟上面在串口的页面设置一样。对我来说,我肯定是要修改它的。完成之后,把树莓派通电就能看到启动过程了。这样就完成破解,接好线就可以使用串口的方式进行树莓派的登录了。我这边的结果是看不到,此时需要重启树莓派。设置完成之后,颜色就变成我喜欢的颜色了。原创 2023-05-02 22:27:47 · 161 阅读 · 0 评论 -
树莓派之Linux分文件编程 && 动态库 && 静态库
一般情况下 这么用:自己写的用双引号,第三方库或者系统的库的头文件用尖括号。要不然经常会出现乱七八糟的错误。原创 2023-05-03 18:22:21 · 85 阅读 · 0 评论 -
守护进程开发方式
需求:要求语音刷手机的程序一直保持运行,防止应用程序崩溃意外。想要开机自启动有一种简单的方法使用。直接借助damon()函数完成。添加,绝对路径加程序名字。原创 2023-04-26 12:06:10 · 69 阅读 · 0 评论 -
带wiringPi库的交叉编译如何进行
因为链接的库的格式不对,是宿主机的平台,出现以下错误上面是自己在网上下载的wiringPi库, 它不适合编译关于树莓派中用到wiringPi库的代码。原创 2023-05-04 21:29:10 · 113 阅读 · 0 评论 -
树莓派之超声波模块测距
作用:就是将当前引脚的电平返回HIGH/LOW,HIGH为1,LOW为0,如果当前引脚没有设置的话随机返回一个值。第一个参数结合上面的例子可以知道它的意思,下面剖析第二个参数的意思,首先它是一个结构体。在使用超声波模块测距之前,需要了解一下Linux 的时间函数。delayMicroseconds(1) 是指延时1微秒。关联函数:gettimeofday()delay(1) 是指延时1毫秒。原创 2023-05-03 23:27:19 · 54 阅读 · 0 评论 -
手撕树莓派驱动
用树莓派学习的目的不仅是为是体验其强大便捷的wiringPi库,更要通过树莓派学会linux内核开发,驱动编写等,做一个属于自己的库。目录下,像鼠标,键盘,屏幕,串口等设备文件都是能看到的,那么硬件要区分它们对应的驱动,open去打开的时候,如何区分它们呢?树莓派的开发之所以简单,是因为有厂家提供了wiringPi库,实现超声波,实现继电器操作,做灯的点亮…这时候就可以根据标准的C库来编写驱动,只要拿到Linux内核的源码,芯片手册、电路图等,即可做开发。内核中存在一个驱动链表,管理所有设备的驱动。原创 2023-05-06 23:02:51 · 164 阅读 · 0 评论 -
树莓派高阶开发之环境搭建
可能会出现 Ubuntu安装vim,提示“Could not get lock…在最后一行添加:当前环境变量路径 + : + 交叉编译工具链文件夹路径。进入交叉编译工具文件夹 (各种cd, ls, 最后 pwd)shift + g 快速跳到最后一行。原创 2023-05-05 12:35:48 · 208 阅读 · 0 评论 -
语言控制刷抖音小项目
char cmd;break;done;\ "");break;break;'\0' };return - 1;return - 1;} }原创 2023-04-20 18:38:08 · 128 阅读 · 0 评论 -
C实现打开/创建数据库
首先要知道一些常用的API。原创 2023-04-27 16:02:30 · 136 阅读 · 0 评论 -
Linux串口开发
Linux原生串口开发(自己封装)原创 2023-04-19 23:26:20 · 70 阅读 · 0 评论