![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux驱动
文章平均质量分 79
面朝大海0902
面朝着大海,海与天仿佛一种颜色,海水闪烁着细碎的银光,小男孩赤足站在细腻的沙滩上,凝视着无垠的碧海,眼中闪烁着星辰与梦想的光芒。
展开
-
Linux---phy外设调试(二)
Linux下phy外设调试原创 2023-05-28 00:08:48 · 2162 阅读 · 0 评论 -
Linux---TP外设调试(ti,tsc2046)
另外关于匹配问题我们可以看到驱动文件与设备树都函数compatible = “ti,tsc2046”,所以理论上只要SPI没有问题(SPI是基础),就会正常匹配,我们也可以在驱动文件probe函数中添加打印以辅助判断或者阅读代码通过驱动文件所建立的节点以及对应打印进行判断。经过上面几步,如果一帆风顺的话可以看到/dev/input下面会产生新的event节点,使用手指点击TP,然后查看有无数值变化,如下图我们点击发现event可以正常上报且有变化产生,证明驱动整体是ok。3、tp的中断是否可以正常收到。原创 2023-05-03 23:22:13 · 1772 阅读 · 0 评论 -
Linux---应用层获取usb设备描述信息&通过endpoint地址数据通讯
VID指的是Vendor ID(厂商识别码),用于唯一标识USB设备的制造商。通过VID和PID,可以确定一个具体的USB设备,因为每个设备的VID和PID是唯一的,可以帮助系统识别和与设备进行交互。与我们要搜索的一致,可以判定为我们需要找的设备节点。应用层可以打开USB设备的节点,读取包括USB设备的配置,端口,端点等信息。为该USB设备的节点,我们后续读取USB设备信息以及数据读写操作都是通过这个节点进行的原创 2023-09-07 20:50:12 · 1776 阅读 · 0 评论 -
使用Ubuntu挂载解析ubi文件与使用mkfs.ubifs、ubinize制作ubi文件
一、应用背景客户嵌入式系统启动即Crash,由于特殊原因没有打开抓取dump的功能,所以无法知晓客户系统Crash的原因。但基本确认是客户在文件系统中添加自己的应用程序启动后导致的,我们拿到故障机后导出rootfs分区对应ubi文件,需要将其挂载,然后排查核心文件是否被修改或者损坏或者其他原因导致Crash(因为原嵌入式系统挂载即Crash,我们需要使用Ubuntu挂载,然后排查)。UBI文件系统不能直接挂载,而是要用 nandsim 模拟出一个 mtd 设备,而且这个 mtd 设备要与 ubi 镜像的原创 2021-09-17 12:14:05 · 6683 阅读 · 0 评论 -
使用seq_file接口导出内核数据到应用层---seq_open()/single_open()
今天介绍另外一种方法---使用seq_file接口,关于该类接口在内核Documentation/filesystems/seq_file.txt中有详细的介绍,相比较于之前的方法其优势可以向应用层导出比较多的数据,例如大于1个PAGE_SIZE,同时驱动文件中我们不用关注复杂的缓冲区管理,这些内核自己处理,属于比较成熟的内核接口。原创 2022-11-24 11:40:18 · 876 阅读 · 0 评论 -
Linux添加开机自启动应用
主要介绍如何在Linux系统中添加开机自启动的应用。原创 2022-11-05 17:19:07 · 1153 阅读 · 0 评论 -
Linux内核日志调试方法
本文档主要介绍在Linux系统下常用的一些内核日志调试方法 oops: 内核告知用户有不幸发生的最常用的方式。 进程上下文:进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈上的内容,当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。 中断上下文中:就是硬件通过触发信号,导致内核调用中断处理程序,进入内核空间,这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。原创 2022-10-24 10:45:58 · 3850 阅读 · 2 评论 -
Linux监控串口数据并写入文件-C语言demo
【代码】Linux监控串口数据并写入文件-C语言demo。程序是基于Linux操作系统,监控串口是否有数据,如果有数据就写入到文件系统中。Demo涉及串口初始化,poll函数监控,以及文件读写操作。原创 2022-10-08 16:45:01 · 1284 阅读 · 0 评论 -
Linux---wifi驱动移植及调试(SSV6x5x)
南方硅谷ssv6x5x驱动移植原创 2022-03-16 00:11:40 · 5100 阅读 · 2 评论 -
Linux中strace工具用法及跟踪分析应用
Linux中strace工具用法及跟踪分析应用原创 2022-02-27 23:39:46 · 2616 阅读 · 0 评论 -
Ubuntu内核源码修改编译及加载验证
Ubuntu系统内核源码修改编译及加载验证原创 2022-02-27 22:51:22 · 1785 阅读 · 0 评论 -
ALSA架构应用程序aplay及amixer调用关系(应用层到内核驱动)
ALSA架构应用程序aplay及amixer调用关系(应用层到内核驱动)原创 2022-02-22 18:23:55 · 1084 阅读 · 0 评论 -
ALSA驱动asoc框架之Platform
ALSA驱动asoc框架之Platform原创 2022-02-22 18:20:23 · 1241 阅读 · 0 评论 -
ALSA驱动asoc框架之Codec
一、Nau8810芯片系统框架图由系统框架图可以看出,输入端为差分MIC输入,输出端可以为MOUT或Speaker。Codec对外硬件接口通过Audio I/O和Digital I/O,其中Audio I/O一般传输的是音频信号为I2S或PCM,Digital I/O为控制信号一般为I2C。芯片引脚分布如下:二、Codec注册原创 2022-02-22 18:15:34 · 1663 阅读 · 0 评论 -
ALSA驱动asoc框架之machine(二)
ALSA驱动asoc框架之machine(二)原创 2022-02-22 18:12:16 · 2859 阅读 · 0 评论 -
ALSA驱动asoc框架之machine(一)
从前面内容我们知道ALSA 驱动 asoc 框架主要包括 codec driver、 platform driver、 machine driver,其中machine是连接codec driver及platform driver的桥梁,我们本节内容来看看platform driver驱动。原创 2022-02-22 18:08:25 · 2739 阅读 · 0 评论 -
音频ALSA架构简介
ALSA(Advanced Linux Sound Architecture)即高级 Linux 声音架构。嵌入式移动设备的音频子系统目前主要是ALSA 驱动 asoc 框架,其中包括 codec driver、 platform driver、 machine driver 等。原创 2022-02-22 18:06:18 · 9937 阅读 · 1 评论 -
Linux---ALSA音频工具arecord、aplay、amixer使用
Linux---ALSA音频工具arecord、aplay、amixer使用原创 2022-02-22 17:49:32 · 8416 阅读 · 0 评论 -
Linux---input输入子系统设备驱动写法 input_allocate_device()、input_event()、input_sync()
Linux---input输入子系统设备驱动写法 input_allocate_device()、input_event()、input_sync()原创 2022-02-22 17:46:14 · 3707 阅读 · 5 评论 -
Linux---驱动属性文件添加、DEVICE_ATTR宏、device_create_file()及sysfs_create_group()
#include <linux/module.h>#include <linux/fs.h>#include <linux/errno.h>#include <linux/miscdevice.h>#include <linux/kernel.h>#include <linux/major.h>#include <linux/mutex.h>#include <linux/proc_fs.h>#i原创 2021-11-14 12:19:40 · 5975 阅读 · 1 评论 -
Linux字符设备驱动新写法
Linux 社区推荐使用动态分配设备号,在注册字符设备之前先申请一个设备号,系统会自动给你一个没有被使用的设备号,这样就避免了冲突。卸载驱动的时候释放掉这个设备号即可,设备号的申请函数如下:int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)函数 alloc_chrdev_region 用于申请设备号,此函数有 4 个参数:dev:保存申请到的设备号。baseminor:原创 2021-11-14 12:17:41 · 538 阅读 · 0 评论 -
Linux---应用层RTC测试程序与时间相关函数time()、gmtime()、localtime()使用
一、时间相关函数说明time_t time(time_t *timer)函数功能: 得到当前日历时间或者设置日历时间参数说明: timer=NULL时得到当前日历时间(从1970-01-01 00:00:00到现在的秒数);timer=时间数值时,用于设置日历时间;如果 timer不为空,则返回值也存储在变量 timer中。函数返回: 当前日历时间time_t是一个unsigned long类型。struct tm *gmtime(const time_t *timer)函数功能: 使原创 2021-11-14 12:16:50 · 1999 阅读 · 0 评论 -
Linux---自旋锁spinlock、信号量semaphore、互斥锁mutex介绍及各自对应使用场景
一、Linux 锁的介绍Linux中按照大类分为2种锁,睡眠锁和自旋锁。其中睡眠锁就是无法获得锁的时候,当前线程进入休眠状态,包括信号量semaphore、互斥锁mutex。自旋锁就是当无法获得锁时,不会休眠,一直循环等待,只有一种spinlock。原创 2021-11-14 12:15:27 · 3480 阅读 · 0 评论 -
Linux---select()实现高精度延时与alarm()定时器
一、select函数int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);设置timeout的值,而将其他参数都置为NULL,当内部时间耗尽后select便会退出。二、select延时程序实例#include <stdio.h>#include <stdlib.h>#include <time.h>#inclu原创 2021-10-24 12:04:33 · 1545 阅读 · 0 评论 -
Linux应用层定时器timer使用---timerfd_create()、timerfd_settime()、timerfd_gettime()
一、timerfd相关函数及说明#include <sys/timerfd.h>int timerfd_create(int clockid, int flags);int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimerspec *old_value);int timerfd_gettime(int fd, struct itimer原创 2021-10-21 22:45:03 · 4906 阅读 · 0 评论 -
Linux---MISC杂项驱动
一、MISC 驱动简介MISC 驱动其实就是最简单的字符设备驱动,所有的 MISC 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。MISC 设备会自动创建 cdev,不需要像我们以前那样手动创建,因此采用 MISC 设备驱动可以简化字符设备驱动的编写。我们需要向 Linux 注册一个 miscdevice 设备, miscdevice是一个结构体定义在文件 include/linux/miscdevice.h 中,内容如下:struct miscdevice { int minor原创 2021-10-06 21:42:08 · 376 阅读 · 0 评论 -
Linux---Pinctrl子系统与GPIO子系统
一、Pinctrl子系统pinctrl子系统主要完成工作:1、获取设备树中 pin 信息2、根据获取到的 pin 信息来设置 pin 的复用功能3、根据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等pinctrl子系统源码目录:drivers/pinctrl,主要涉及 2 个对象: pin controller、 client device。前者提供服务:可以用它来复用引脚、配置引脚。后者使用服务:声明自己要使用哪些引脚的哪些功能,怎么配置它们driver原创 2021-10-06 16:31:27 · 2158 阅读 · 0 评论 -
Linux休眠与唤醒---wakelock唤醒锁与autosleep功能使用
一、Linux系统休眠在嵌入式设备中由于省电功耗等原因我们需要让系统在不忙的时候进入休眠模式,Linux pm core提供给我们wakelock及autoslepp内核休眠机制。autosleep 和 wakelock是并行存在,只有 wakelock 唤醒锁全部释放且 autosleep 为 enable 时候系统才能进入休眠;二、autosleep功能节点路径为/sys/power/autosleep,该值为mem表示打开autoslepp功能,如果值为off表示关闭。如果没有此节点路径,我原创 2021-09-11 17:59:37 · 5966 阅读 · 0 评论 -
Linux中断子系统---中断申请request_irq()与中断线程化request_threaded_irq()
一、申请中断request_irq()Linux中使用中断需要先进行申请,申请中断的API函数如下:int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev)irq:要申请中断的中断号。handler:中断处理函数。name:中断名字,设置以后可以在/proc/interrupts 文件中看到对应的中断名字。原创 2021-09-01 21:50:52 · 8446 阅读 · 0 评论 -
Linux中断子系统---workqueue工作队列
一、工作队列相关API初始化函数:#define INIT_WORK(_work, _func)_work 表示要初始化的工作, _func 是工作对应的处理函数。也可以使用 DECLARE_WORK 宏一次性完成工作的创建和初始化,宏定义如下:#define DECLARE_WORK(n, f)n 表示定义的工作(work_struct), f 表示工作对应的处理函数。工作调度函数:bool schedule_work(struct work_struct *work)其中work_st原创 2021-08-22 22:17:32 · 519 阅读 · 0 评论 -
Linux中断子系统---tasklet
一、tasklet相关API初始化函数:void tasklet_init(struct tasklet_struct *t,void (*func)(unsigned long), unsigned long data);函数参数和返回值含义如下:t:要初始化的 taskletfunc: tasklet 的处理函数。data: 要传递给 func 函数的参数或者使用DECLARE_TASKLET(name, func, data)调度tasklet函数:void tasklet_sch原创 2021-08-22 21:43:31 · 166 阅读 · 0 评论 -
Linux内核定时器---init_timer()、add_timer()与mod_timer()使用
一、内核定时器API函数init_timer(timer):初始化timer。setup_timer(timer, fn, data):与init_timer()类似,fn为定时器回调函数,data为回调函数的参数。void add_timer(struct timer_list *timer)用于向 Linux 内核注册定时器,使用 add_timer 函数向内核注册定时器以后,定时器就会开始运行。int mod_timer(struct timer_list *timer, unsigned原创 2021-08-16 21:54:41 · 11950 阅读 · 4 评论 -
Linux异步通知---fasync_helper()、kill_fasync()函数介绍与使用
一、fasync_helper()与kill_fasync()函数应用程序通过fcntl置FASYNC标志位,触发对应驱动文件的fasync()函数执行(上节有解释原因Linux异步通知—signal()、fcntl()函数介绍与使用),该函数需要使用fasync_helper()函数进行fasync_struct结构体初始化,函数原型:/* * fasync_helper() is used by almost all character device drivers * to set up th原创 2021-08-11 22:57:18 · 5413 阅读 · 0 评论 -
Linux异步通知---signal()、fcntl()函数介绍与使用
一、 signal()函数介绍 signal函数是设置一个函数来处理信号,即带有 signum 参数的信号处理程序 linux下man signal如下: #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);其中signum – 在信号处理程序中作为变量使用的信号码。下面是一些重要的标准原创 2021-08-01 17:44:10 · 1573 阅读 · 0 评论 -
poll、poll_wait函数与等待队列DECLARE_WAIT_QUEUE_HEAD、wake_up_interruptible()、wait_event_interruptible()使用
一、 poll()函数应用层使用select()和poll()系统函数查询是否可对设备进行无阻塞的访问时,会引发设备驱动中的poll()函数被执行。原创 2021-07-24 18:26:30 · 4248 阅读 · 4 评论 -
Linux字符设备驱动基本写法
一、自己编写字符驱动几个关键点:1、platform_driver_register(platform_driver);—在模块init函数中注册platform_driver2、platform_driver与platform_device匹配;—probe探测函数被调用3、注册字符设备驱动register_chrdev(major, const char *name, const struct file_operations *fops)返回主设备号—在probe探测函数中调用regist原创 2021-07-17 23:04:53 · 294 阅读 · 0 评论