LINUX驱动开发
文章平均质量分 67
LINUX驱动开发
lhh_qrsly
嵌入式领域软件和硬件知识分享
展开
-
linux CSI接口定义
CSI(Camera Serial Interface)是一种串行通信协议,用于将图像传感器的数据传输到处理器上,通常用于与摄像头模块进行通信。在Linux系统中,CSI接口定义使用堆栈结构实现,用户空间应用程序通过ioctl()操作系统调用与CSI接口进行交互。CSI框架程序:用于与CSI驱动程序和V4L2驱动程序进行交互,以从摄像头模块中读取数据。CSI驱动程序:负责与硬件设备进行交互,并提供一个接口供用户空间应用程序调用。应用程序:使用CSI接口获取图像数据并进行处理,如图像识别、视频流媒体等。原创 2023-06-03 21:43:41 · 735 阅读 · 0 评论 -
Ubuntu系统上的USB端口号绑定
1 为什么绑定USB端口号USB端口号会随设备的插拔发生变化,不方便测试,因此需要将USB端口号绑定。2 如何绑定USB端口号将端口重映射到新的固定的名字,并且设置其权限为可读。2.1 查询USB设备端口信息在未插入USB设备前,打开终端,执行以下命令查看USB端口信息:lausb1输出如下:Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hubBus 001 Device 004: ID 13d3:56a6 IMC转载 2021-11-09 16:11:32 · 643 阅读 · 0 评论 -
Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点
Linux下USB设备节点名不固定问题经常会遇到以USB转串口设备为例,通常设备节点名为ttyUSBx(x为0~n),Linux内核会根据设备插入的先后顺序进行编号的分配,比如第一个插入的设备编号为ttyUSB0,然后依此加1,变为ttyUSB1,ttyUSB2……如果仅仅以设备节点ttyUSBx来区别具体是哪个设备,因为末位的编号是随时会变的,所以就会造成混乱。无法保证A设备就是ttyUSB0,B设备就是ttyUSB1。在设备文件/dev目录下并没有提供固定显示ttyUSB的方法,但是,其实,每个..转载 2021-11-09 15:17:26 · 2861 阅读 · 0 评论 -
linux PCI设备驱动
一、PCI简介PCI是一种外设总线规范。我们先来看一下什么是总线:总线是一种传输信号的路径或信道。典型情况是,总线是连接于一个或多个导体的电气连线,总线上连接的所有设备可在同一时间收到所有的传输内容。总线由电气接口和编程接口组成。本文讨论Linux 下的设备驱动,所以,重点关注编程接口。PCI是Peripheral Component Interconnect(外围设备互联)的简称,是普遍使用在桌面及更大型的计算机上的外设总线。PCI架构被设计为ISA标准的替代品,它有三个主要目标:获得在计算机和外设之转载 2021-11-09 09:42:31 · 658 阅读 · 0 评论 -
linux下设备树中惯用的of函数
从device_node中获取信息:int of_property_read_u8_array(const struct device_node *np, const char *propname,u8 *out_values, size_t sz);int of_property_read_u16_array(const struct device_node *np, const char *propname,u16 *out_values, size_t sz);int of_property_r转载 2021-11-08 15:59:07 · 264 阅读 · 0 评论 -
Linux的硬盘使用情况、挂载、SSD挂载(查看df -h不能看到的卷)
解决AWS 挂载、解决挂载完重启就消失等问题linux上的盘和window的有区别,磁盘空间必须挂载在目录上,要不然没用对与新增的硬盘、SSD固态硬盘、挂载到linux上的操作如下:df -h #显示目前在Linux系统上的文件系统的磁盘使用情况统计。lsblk #列出块设备信息(df -h不能看到的卷)mount #挂载命令现在 我们有个新的硬盘450G没有挂载1、查看linux下的硬盘挂载的空间、使用空间使用下面命令格式化已附加上,但df转载 2021-11-04 14:40:09 · 1142 阅读 · 0 评论 -
让你明白“软链接”和“硬链接”的区别
虽然又是知名撕逼王曾某的撕逼帖,但是我还是想就题目中链接的问题简单地讲讲。什么是链接?链接简单说实际上是一种文件共享的方式,是 POSIX 中的概念,主流文件系统都支持链接文件。它是用来干什么的?你可以将链接简单地理解为 Windows 中常见的快捷方式(或是 OS X 中的替身),Linux 中常用它来解决一些库版本的问题,通常也会将一些目录层次较深的文件链接到一个更易访问的目录中。在这些用途上,我们通常会使用到软链接(也称符号链接)。软链接和硬链接的区别是?下面我们进入正题,来探讨一下软硬两转载 2021-05-14 10:22:46 · 129 阅读 · 0 评论 -
__setup宏以及表驱动编程
__setup这条宏在Linux Kernel中使用最多的地方就是定义处理Kernel的启动参数的函数及数据结构,宏定义如下:#define __setup(str, fn) __setup_param(str, fn, fn, 0)#define __setup_param(str, unique_id, fn, early) static char _setup_str##unique_id[] __initdata __aligned(1) = str; static struct obs_转载 2021-03-24 19:41:33 · 242 阅读 · 1 评论 -
向Linux内核添加新的驱动程序
drivers目录增加新的目录fregfreg/├── freg.c├── freg.h├── Kconfig└── Makefile在新增的目录中增加Makefile和Kconfig文件,上面的目录中已经添加.cat drivers/freg/Makefileobj-$(CONFIG_FREG) += freg.ocat drivers/freg/Kconfigconfig FREGtristate “Fake Register Driver”default nhelp.转载 2021-03-23 13:58:41 · 278 阅读 · 0 评论 -
linux input 按键驱动几点说明
如果我们要写一个gpio 的按键驱动,可以有两种写法写个字符设备,利用中断 ,阻塞读写就能实现。注册成input 设备,利用中断向上报告按键。如果只是测试,第一种写法是可行的,也更加简洁,它的优点就在于高效,不依靠输入子系统。但是,这种按键实现复杂一点的按键功能就要写很多底层代码了,而且它有个最大的缺点:上层的界面系统很难友好的使用这种驱动,除非把上层界面系统的按键接口做相应的修改。所以,input 设备,依靠了输入子系统,上层界面系统对它的使用很方便了。input 按键驱动的工作机制大概如转载 2021-03-10 15:43:58 · 448 阅读 · 0 评论 -
LINUX 基于设备树编写按键中断驱动程序
Linux内核版本:4.14.2本文基于itop4412开发板,编写驱动程序响应HOME按键中断,编写这个按键驱动程序需要做如下几个工作:1. 在原理图中确定HOME按键的引脚2. 在设备树文件中添加节点描述HOME引脚3. 重新编译烧写设备树4. 编写驱动程序,调用设备树接口函数获取HOME引脚的中断号,使用中断号注册按键中断处理程序在原理图中确定HOME按键的引脚在原理图中找到HOME按键对应的引脚是GPX1_1在设备树文件中添加节点描述HOME引脚itop4412开转载 2021-03-01 13:41:56 · 704 阅读 · 0 评论 -
Linux设备树设备节点compatible属性和驱动compatible(驱动加载)
Linux设备树设备节点compatible属性和驱动compatible(驱动加载)比如按键驱动kernel\drivers\input\keyboard\gpio_keys.c下按键驱动的定义static struct of_device_idgpio_keys_of_match[] = {{.compatible = “gpio-keys”, },{},};static struct platform_drivergpio_keys_device_driver = {.probe转载 2021-02-28 11:22:56 · 3007 阅读 · 0 评论 -
linux设备树详解1
原文在Linux3.x版本后,arch/arm/plat-xxx和arch/arm/mach-xxx中,描述板级细节的代码(比如platform_device、i2c_board_info等)被大量取消,取而代之的是设备树,其目录位于arch/arm/boot/dts1.设备树的组成1个dts文件+n个dtsi文件,它们编译而成的dtb文件就是真正的设备树soc厂商会把soc公共的特性和多块开发板公用的特性提炼为dtsi,而dts则负责描述某个具体的产品(开发板)的特性。dts直接或间接的包含多个d转载 2021-02-27 19:37:29 · 151 阅读 · 0 评论 -
安卓 添加 物理 按键
添加新的按键到input系统,可以直接使用gpio-keys,gpio-keys驱动相关代码已实现,我们只需通过简单配置就可以实现该功能。dtsi添加找到gpio_keys,在里面添加对应的按键,如下talkback_sq, 主要需要配置的有如下几项gpios,对应原理图中的引脚linux,input-type,上报事件的类型,我们这里选择1(EV_KEY)按键事件,定义在input-event-codes.hlinux,code,上报的事件的code gpio_keys { compati翻译 2021-02-24 10:17:19 · 353 阅读 · 0 评论 -
安卓 物理按键 内容
1、getevent介绍root@sabresd_6dq:/ # geteventadd device 1: /dev/input/event0 name: "ar1021 Touchscreen"could not get driver version for /dev/input/mice, Not a typewriteradd device 2: /dev/input/event2 name: "gpio-keys"add device 3: /dev/input/原创 2021-02-23 19:52:49 · 581 阅读 · 0 评论 -
多主机共享ssh Public/Private Key git clone
好了,下面一步一步来实现SSH Public/Private Key的在多台电脑中的共用:0. 首先我们给旧的MBP起名叫OLD, 新的叫NEW,方面后面区分拷贝OLD上的id_rsa和id_rsa.pub到云端/U盘/邮箱/…中备份。这两个文件位于用户目录下的隐藏文件夹~/.ssh/中。在NEW的终端(Terminal)上执行$ git config [–global] user.name “[name]” //请保持和以前一样$ git config [–global] user.emai原创 2020-12-31 15:25:27 · 337 阅读 · 0 评论 -
Linux内核中Makefile、Kconfig和.config的关系
我们在编译Linux内核时,往往在Linux内核的顶层目录会执行一些命令,这里我以RK3288举例,比如:make firefly-rk3288-linux_defconfig、make menuconfig、make firefly-rk3288.img、make zImage等等。先不管这具体的含义,首先提出几个疑问:(1)Linux内核如此庞大(几万个文件),目录又分为很多层,它是如何将各层目录下的文件关联起来的?(2)Linux支持如此多的架构(X86、ARM、AVR、mips等等),为何我们在转载 2020-12-28 19:33:33 · 150 阅读 · 0 评论 -
用fastboot命令将boot.img文件push到机器里
首先保证adb有root权限1、首先进入fastboot模式执行 adb reboot bootloader 重起至fastboot介面2、烧boot.img执行 fastboot flash boot boot.img如果烧system.img执行 fastboot flash system system.img也可以擦出分区:如:fastboot erase userdata 参数用户数据分区。fastboot erase cache 参数缓存3、重启机器执行 fastboot re翻译 2020-11-05 22:30:09 · 6970 阅读 · 0 评论 -
Linux-4412用汇编程序控制寄存器R0、R1、R2实现KED亮灭
一、控制原理说明先看一下原理图如上图可知,Tiny4412有4个用户LED灯,控制它们四个引脚分别是GPM4_0~ GPM4_3,由原理可知,当IO引脚为高电平时,LED灯灭,当IO引脚为低电平时LED亮。我们要做的工作就是设置GPM4_0~ GPM4_3为输出功能,且控制且输出电平高低即可。二、程序说明1.led.S由原理图可知,程序只进行了两步操作;第一步:设置GPM4_0GPM4_3相对应的控制寄存器GPM4CON,使GPM4_0 GPM4_3四个引脚为输出功能。第二步:设置其对应的翻译 2020-10-21 20:48:08 · 1208 阅读 · 0 评论 -
Linux iTP4412最小系统挂载U盘(SD、TF卡)并执行程序
一、在Ubuntu下编译C文件使用指令"arm-none-linux-gnueabi-gcc-4.4.1 -o HelloWorld HelloWorld.c -static"编译下面的c文件:把生成的HelloWorld拷贝到SD卡中。二、使用“fdisk -l”查看系统给存储设备分配的设备名1.未插入SD卡时,使用“fdisk -l”命令: 现在看到的是板载16GB存储。2.插上SD卡时,使用“fdisk -l”命令:可以看到多出来了一个插入的32G的SD卡。三、使用"mount"原创 2020-10-21 19:33:59 · 370 阅读 · 0 评论 -
itop4412 linux-最小根文件系统制作与NFS挂载
前言在前面的文章中,完成了uboot和内核的基本移植教程,为驱动的学习打下了一定的基础。为了后期更好的学习,本篇文章记录了最小文件系统的制作、nfs挂载根文件系统教程,搭建一个方便驱动教程学习的环境。注:本文开发环境均基于ubuntu18.04 LTS平台搭建。交叉编译工具安装说明后期所有程序都是在开发板上运行的,基于ARM Coretex-A9的exynos 4412,而我们开发机是X64平台,所以需要安装交叉编译链,编译出能在开发板上运行的可执行二进制。安装在最新的ubuntu18.04翻译 2020-10-21 19:30:01 · 237 阅读 · 0 评论 -
LINUX-makefile使用.lds链接脚本以及 $@ ,$^, $,< 解析
先来分析一个简单的.lds链接脚本例1,假如现在有head.c init.c nand.c main.c这4个文件:1.1 首先创建链接脚本nand.lds:1 SECTIONS { 2 firtst 0x00000000 : { head.o init.o nand.o}3 second 0x30000000 : AT(4096) { main.o }4 } SECTIONS { … } 用来描述输出文件的内存布局。这个脚本里规翻译 2020-10-21 09:38:37 · 274 阅读 · 0 评论 -
LINUX修改交叉编译工具的路径(修改环境变量)
修改交叉编译工具路径,需要修改环境变量。在Ubuntu 命令行中,执行命令“cd /root”和“vim .bashrc”,打开环境变量文件“.bashrc”,如下图所示。然后在“.bashrc”文件中的最后一行添加如下信息:“export PATH=$PATH:/usr/local/arm/arm-2009q3/bin”如下图所示。修改完成后保存退出。执行下列命令,更新环境变量“source .bashrc”的命令,如下图所示。最后,在Ubuntu 命令行中输入命令“arm”,然后按TA原创 2020-10-21 03:07:35 · 2582 阅读 · 0 评论 -
ITOP4412-OTG方式烧写Android
OTG方式烧写Android1、准备好镜像文件:“zImage”,“ramdisk-uboot.img”和“system.img”,这就够了,放到fastboot同级目录下,至于“u-boot-iTOP-4412.bin”这个文件,其实不用,毕竟OTG方式烧写本身就是需要uboot引导的;切记要找准前三个镜像文件,不然会出现反复重启、黑屏和只显示安卓logo等问题,我就是弄错了zImage文件!2、准备好fastboot和adb:出现的问题:(1)设备管理器没出现ADB驱动:下载驱动人生,自然可原创 2020-10-21 02:39:55 · 406 阅读 · 0 评论 -
嵌入式linux为什么可以通过PC上的串口去执行目标板上的命令?
板子软件bai分三部分:1、uboot (负责初始化基本硬du件,如串口,网卡,usb口等,然zhi后引导系统dao运行)2、linux系统 (真正的操作系统)3、你的应用程序 (基于操作系统的软件应用)当你开发板上电时,uboot运行,就会把串口设备初始化好,能够往串口输出打印信息。还可以接受你透过电脑的串口助手从串口发来的信息。它把你的信息解释成命令,然后转到系统执行。...原创 2020-10-16 12:28:08 · 184 阅读 · 0 评论 -
什么是文件系统?嵌入式Linux中的根文件系统?
文件系统是对一个存储设备上的数据和元数据进行组织的机制。这种机制有利于用户和操作系统的交互。在一篇oracle的技术文章中看到这样一句话尽管内核是 Linux 的核心,但文件却是用户与操作系统交互所采用的主要工具。这对 Linux 来说尤其如此,这是因为在 UNIX 传统中,它使用文件 I/O 机制管理硬件设备和数据文件这句话我是这样理解的,在Linux没有文件系统的话,用户和操作系统的交互也就断开了,例如我们使用最多的交互shell,包括其它的一些用户程序,都没有办法运行。在这里可以看到文件系统相对于翻译 2020-10-16 11:11:54 · 163 阅读 · 0 评论 -
Linux驱动-LED实战
前言 在学习单片机(比如51单片机和STM32)的时候,我们可以直接对单片机的寄存器进行操作,进而达到控制pin脚的目的。而Linux系统相较于一个单片机系统,要庞大而复杂得多,因此在Linux系统中我们不能直接对pin脚进行操作。Linux系统讲究驱动分层,pinctrl子系统和GPIO子系统就是驱动分层的产物。如果我们要操作pin脚,就必须要借助pinctrl子系统和GPIO子系统。 pinctrl子系统的作用是pin config(引脚配置)和pin mux(引脚复用),而如果pin脚被复用为翻译 2020-10-16 10:33:33 · 330 阅读 · 0 评论 -
Linux-向内核添加驱动模块代码
将驱动代码添加到内核中make menuconfig 的本质遍历, 解析并且显示所有目录下的 kconfig 文件make menuconfig 中的内容来源于各个 Kconfig 文件中的item实例配置 make menuconfig 就是配置 Kconfig 文件各个 item 的值.config 文件 - 实时汇总 make menuconfig 中做的所有配置make实质遍历所有目录下的 Makefile 文件, 并按照 Makefile 的内容编译相关代码参考 .config 文原创 2020-10-15 20:29:21 · 287 阅读 · 0 评论 -
Linux驱动(三)——完善设备驱动自动创建设备号
APP部分:#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>/**argc:应用程序参数个数,包括应用程序本身*argv[]:具体的参数内容,字符串形式*./shanwuyanAP翻译 2020-10-15 14:42:26 · 242 阅读 · 0 评论 -
Linux驱动之设备树
前言 在前面的文章中,我们只介绍了如何对驱动和设备节点进行操作,并没有涉及到对具体硬件设备的操作。从本篇开始,将介绍对硬件设备的操作。这里,我们要引入一个新的概念——设备树。 在学习Linux驱动时,我们一般会用到ARM开发板。ARM开发板的厂商有很多,我们熟知的有正点原子、迅为、友善之臂、天嵌等等。我们可以想象这样一种场景,每家开发板厂商都自己开发板载设备的驱动,即使使用同一款处理器,但每款板子的厂商对于板载硬件的定义是不相同的,为了板载硬件能够正常工作,每家厂商都会根据自己的板载硬件来设计不同于转载 2020-10-15 19:28:00 · 194 阅读 · 0 评论 -
什么是Linux主设备号和次设备号
Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。为了管理这些设备,系统为设备编了号,每个设备号又分为主设备号和次设备号。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。对于常用设备,Linux有约定俗成的编号,如硬盘的主设备号是3。一个字符设备或者块设备都有一个主设备号和次设备号。主设备号和次设备号统称为设备号。主设备号用来表示一个特定的驱动程翻译 2020-10-15 14:12:58 · 1771 阅读 · 0 评论 -
Linux驱动(二)——设备操作集file_operations:
结构体file_operations为应用程序提供了操作设备的接口,包括打开设备、关闭设备、读设备、写设备等操作。驱动程序部分:/* 源代码文件名为"xxx.c"*/#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/uaccess.h>#define SHANWU原创 2020-10-15 13:17:38 · 333 阅读 · 0 评论 -
Linux驱动(一)——驱动的基本框架
/ *源代码文件称为:shanwuyan.c * /#包括 < LINUX / module.h中>#包括 < LINUX / kernel.h当>#包括 < LINUX / init.h里>#包括 < LINUX / fs.h文件>#包括 < LINUX / uaccess.h中>static int __init shanwuyan_init(void) //驱动入口函数{ printk(KERN_EMERG “ shan原创 2020-10-15 12:58:38 · 354 阅读 · 0 评论 -
Linux驱动程序学习
记录我在学习过程中编写的代码/记录Linux驱动学习过程中所写的代码如何编写一个简单的Linux驱动(一)-驱动的基本框架: 包括驱动入口函数,出口函数,两个函数的注册,开源协议。实现的功能是加载和卸载驱动时打印相应的字符串。如何编写一个简单的Linux的驱动(二) -设备操作集的file_operations: 。结构体file_operations中为应用程序提供了操作设备的接口,包括打开设备,关闭设备,读设备,设备写操作等如何编写一个简单的Linux的驱动(三) -完善设备驱动 。实转载 2020-10-15 12:52:31 · 62 阅读 · 0 评论 -
初学嵌入式linux及ARM开发板的五点建议
第一,学习基本的单片机编程。对于学硬件的人而言,必须先对硬件的基本使用方法有感性的认识,更必须深刻认识该硬件的控制方式,如果一开始就学Linux系统、学移植那么只会马上就陷入一个很深的漩涡。我在刚刚开始学ARM的时候是选择ARM7(主要是当时ARM9还很贵),学ARM7的时候还是保持着学51单片机的思维,使用ADS 去编程,第一个实验就是控制 led。学过一段时间ARM的人都会笑这样很笨,实际上也不是,我倒是觉得有这个过程会好很多,因为无论做多复杂的系统最终都会落实到这些最底层的硬件控制,因此对这些硬件的原创 2020-10-14 00:14:28 · 1040 阅读 · 3 评论 -
Linux开发板上开机自动运行用户应用程序
开机后自动运行用户的应用程序或启动系统服务的命令保存在开发板根文件系统的/usr/etc/rc.local文件中。有的开发板开机后自动运行图形界面程序,需要按住ctrl+c让开发板进入到Linux的SHELL提示符界面。其实可通过注释掉rc.local文件中调用图形界面的命令,增加运行用户应用程序的命令,达到开机自动运行用户应用程序的目的。下面以我做的实验为例,描述具体的实现步骤。1.进入pc机的Linux 操作系统,在/nfs/usr/下通过mkdir lz 命令新建一个名为lz的文件夹,原创 2020-10-14 00:05:51 · 745 阅读 · 0 评论