在Linux驱动中如何获取platform_device的资源?
2025-03-30
struct platform_device
是用于描述硬件信息的驱动,其他驱动可以通过名称和它进行匹配。一旦匹配成功后,可以通过它来获取硬件的信息。下面的例子就演示了如何进行驱动匹配和获取硬件信息...
2025-03-30
struct platform_device
是用于描述硬件信息的驱动,其他驱动可以通过名称和它进行匹配。一旦匹配成功后,可以通过它来获取硬件的信息。下面的例子就演示了如何进行驱动匹配和获取硬件信息...
2025-03-29
id_table
是一个指向struct platform_device_id
数组的指针,用于定义驱动可以匹配的设备ID列表。当内核检测到一个平台设备时,会检查其名称或ID是否与驱动提供的id_table
中的任一条目匹配,从而决定是否绑定该驱动...
2025-03-28
struct platform_device
是Linux内核中用于表示平台设备的重要数据结构,它是Linux设备模型的一部分,特别用于那些不通过传统总线(如 PCI、USB 等)连接的设备...
2025-03-27
Linux hrtimer(高分辨率定时器)是Linux内核提供的一种高精度定时机制,用于支持微秒(μs)甚至纳秒(ns)级别的定时操作,相比传统的定时器(如timer_list
)具有更高的精度和灵活性...
2025-03-26
在Linux内核的struct platform_driver
驱动结构中,id_table
和of_match_table
都用于驱动与设备的匹配,但它们的用途和工作方式有所不同...
2025-03-26
在Linux内核中,struct pwm_device
是用于描述和管理PWM(脉冲宽度调制)设备的核心数据结构。它通常定义在include/linux/pwm.h
中,主要作用是为PWM控制器(硬件)和消费者(驱动)之间提供统一的抽象接口...
2025-03-25
struct tasklet_struct
是Linux内核中用于实现"小任务"(tasklet)机制的数据结构。Tasklet是一种底层的延迟执行机制,常用于中断处理的下半部(Bottom Half)...
2025-03-25
struct work_struct
是Linux内核中用于实现延迟工作(deferred work)机制的重要数据结构,属于工作队列(workqueue)子系统的一部分...
2025-03-24
struct input_dev
是Linux内核中用于表示输入设备的数据结构,定义在<linux/input.h>
头文件中。它用于管理和描述输入设备(如键盘、鼠标、触摸屏等)及其事件...
2025-03-18
链表是一种常用的数据结构,在开发中经常会使用到。在Linux内核中同样也是一个很常用的数据结构,而且内核对链表实现了很多相关函数,极大方便了链表的使用。内核中的链表和一般的链表使用方法是不一样的...
2025-03-18
每次打开字符设备驱动文件都会重新创建一个struct file
结构体。如果想为每个打开的文件保留私有的数据,可以使用file->private_data
成员...
2025-03-18
Linux的sysfs是一种虚拟文件系统,用于将内核对象、属性和关系导出到用户空间,方便用户和管理员查看和配置内核及硬件信息。sysfs通常挂载在/sys
目录下...
2025-03-17
mmap是Linux系统中的一种系统调用,用于将文件或设备映射到进程的地址空间,从而实现内存映射文件或共享内存的功能。通过mmap,进程可以直接访问文件内容,而无需使用传统的read和write系统调用...
2025-03-16
一般来说,驱动是不会访问文件系统的,更不会在文件系统上创建除设备驱动文件外的其他文件。但是有时为了满足某些奇怪的需求,会有访问文件系统的需求...
2025-03-16
DMA(直接内存访问,Direct Memory Access)是一种允许硬件设备直接访问系统内存的技术,无需通过CPU的干预。它主要用于提高数据传输效率,减少CPU的负担...
2025-03-15
在Linux驱动中,信号量是很常用的工具,可以保证数据安全。下面的例子实现使用信号量模拟自旋锁,保证不同线程安全的访问临界空间数据...
2025-03-15
在Linux驱动中,可以使用completion
进行同步。下面的例子就使用完成量等待定时器回调函数返回...
2025-03-14
在Linux驱动中,自旋锁是很常用的工具,可以保证数据安全。因为自旋锁会一直占用CPU,所以一般用于保护能够快速完成的临界区...
2025-03-14
在Linux驱动中,定时器是很常用的工具,可以让延时执行一些函数。下面的例子实现了延时一秒钟执行一次定时器回调函数...
2025-03-14
在Linux驱动中,原子操作是很常用的工具,可以保证数据安全。一般为了保护数据安全会使用锁机制,不过锁的开销比较大。如果是简单的整数运算...
2025-03-14
在Linux驱动中,互斥锁是很常用的工具,可以保证数据安全。下面的例子实现不同线程安全的访问临界空间数据...
2025-03-13
在Linux内核中,miscdevice是一种用于简化字符设备驱动注册的机制。它适用于那些不需要主设备号的简单设备驱动。miscdevice使用一个固定的主设备号(10)...
2025-03-12
很好奇I2C设备是如何与驱动进行匹配的吧?一般是通过设备树文件来描述I2C从设备的信息,例如名称和地址等。驱动通过和名称与从设备进行匹配...
2025-03-12
监听GPIO引脚变化是嵌入式开发的基础知识。在Linux驱动中监听GPIO电平变化也是很方便的。下面的例子就演示了如何监听GPIO引脚电平变化...
2025-03-11
GPIO引脚控制是嵌入式开发的基础知识。在Linux驱动中控制GPIO也是很方便的。下面的例子就演示了如何初始化GPIO引脚,并获取和设置GPIO引脚电位...
2025-03-11
SPI是嵌入式开发中常用的一个通信协议,下面的例子给大家演示如何使用IIO子系统来和SPI设备进行通信,并获取设备的信息...
2025-03-10
Industrial I/O (IIO)是 Linux 内核中的一个子系统,专为处理工业应用中的模拟数字转换器(ADC)、数字模拟转换器(DAC)、惯性测量单元(IMU)、光传感器、压力传感器等设备而设计...
2025-03-09
串口通信是嵌入式开发的常用通信方式之一。下面就给大家演示一下,如何使用Linux驱动来进行串口通信?下面的例子主要实现了串口通信回显功能...
2025-03-09
i2c
是嵌入式开发的常用协议,下面我们学习通过Linux驱动来读写i2c
设备的数据。通过设备树来获取i2c
的信息,使用Linux内核的i2c
子系统提供的接口来控制读写数据...
2025-03-08
点亮第一个LED灯是嵌入式开发的Hello World
程序。下面我们学习通过Linux驱动来点亮LED灯。通过设备树来获取LED的信息,使用Linux内核的GPIO子系统提供的接口来控制LED灯...
2025-03-07
进行嵌入式开发的主流方法是使用设备树文件添加设备信息,驱动通过获取设备信息对设备进行操作。下面将演示如何写一个设备树插件文件和驱动代码...
2025-03-06
进行嵌入式开发一般都需要嵌入式开发板,但是购买嵌入式板需要一定费用。对于初学者也不知道选择哪种类型的嵌入式板才比较合适...
2025-03-05
/sys/kernel
是Linux系统中的一个虚拟文件系统目录,位于sysfs
文件系统下,主要用于提供内核相关的信息和配置接口。通过它,用户和应用程序可以访问和调整内核的某些运行时参数和行为...
2025-03-05
写简单的驱动,一般一个源文件就足够了。写复杂的驱动,不仅要按照不同的功能模块组织项目。而且还有可能在一个项目里构建几个驱动。所以源文件也会比较多...
2025-03-04
proc
文件系统并不是真正存在于磁盘上的文件系统,而是由 Linux 内核动态创建的,用于提供一种访问内核数据结构和运行时系统信息的接口。它通常挂载在/proc
目录下...
2025-03-03
在Linux内核驱动中创建线程是一个很常见的功能。下面的例子使用两种方法来创建线程。其中kthread_run
函数不需要创建线程,直接就让线程运行起来,比较方便...
2025-03-03
如果给Linux驱动实现fasync
函数,那么驱动就能够通过信号机制异步通知客户端程序。这个方法一般比较少用,但我们也要熟悉这种方法。下面就给大家带来一个完整的例子...
2025-03-03
send_sig_info
是Linux内核中的一个函数,用于向指定进程发送信号。它允许内核代码向特定进程发送信号,并附带一些额外的信息(通过struct siginfo
结构体传递)...
2025-03-02
线程同步在编程中是很常见的功能。在Linux内核中也提供了等待队列同步机制
,可以很方便进行线程同步。下面就给出了完整的例子,写入操作触发等待队列,等待队列中的等待者会得到执行的机会...
2025-03-02
一个驱动实现了poll
函数,就能够让客户端程序使用select
或epoll
等异步IO系统调用进行读写驱动,大大丰富了驱动的使用。下面的例子就带大家看看如何去实现...
2025-03-01
应用层客户端程序使用ioctl
来控制设备的状态是一种很常见的情况。下面的例子就演示了如何去实现一个这样的字符串设备驱动...
2025-02-28
一个驱动可以管理多个设备文件,通过不同的从设备号
来区分它们。下面就提供了实例代码实现如何创建多个从设备文件
和区分不同的从设备文件
的访问请求...
2025-02-27
每次安装字符设备驱动都需要使用mknod
命令,在/dev
目录下创建对应的字符设备。这显然是一件麻烦的事情...
2025-02-26
字符设备驱动在Linux系统中是很常见的。字符设备驱动是Linux内核中用于管理字符设备的模块。字符设备以字节流形式进行数据传输,通常不支持随机访问...
2025-02-26
dmesg
是一个用于显示或控制内核环形缓冲区消息的命令。它主要用于查看系统启动时的内核消息,以及系统运行期间内核产生的各种日志信息...
2025-02-25
panic()
是Linux内核中一个关键函数,用于在发生无法恢复的严重错误时终止系统运行,并打印错误信息...
2025-02-25
dump_stack()
是 Linux 内核中一个关键的调试函数,用于在系统发生异常(如内核panic、oops或死锁)时打印当前线程的调用堆栈信息...
2025-02-25
oops
是Linux内核中用于处理严重错误的机制。当内核检测到无法恢复的错误(如空指针解引用、非法内存访问等)时,会触发...
2025-02-25
BUG_ON()
是Linux内核中一个用于调试和错误处理的宏,用于在特定条件为真时触发内核异常(如panic
或oops
),并打印调试信息(包括调用堆栈)...
2025-02-25
在dump_stack
函数的基础上还有一个WARN_ON()
函数。 WARN_ON()
是Linux内核中一个用于调试的宏,用于在特定条件为真时触发警告并打印警告信息,同时输出当前线程的调用堆栈(Call Stack)...
2025-02-23
应用层的程序一般都会依赖一些外部的库,驱动程序也不例外。驱动间也可以形成一个依赖链,将驱动的功能分割到不同的驱动。能减少驱动的复杂性和增加可维护性...
2025-02-17
在写函数的时候,为了控制内部的运行逻辑或者对内部进行初始化,一般都会给函数传入参数。同样的为了控制内核驱动的行为,我们也希望在驱动加载的时候给它传入初始化参数...
2025-02-10
大多数时候我们都不需要将内核驱动添加到内核源码中,可以通过insmod
命令在需要的时候自己手动安装驱动。不过将驱动添加到源码树中有下面的好处...
2025-02-09
学习Linux
内核相关知识从什么角度入手不好把握。有的人喜欢从文档开始看,了解整个内核的体系结构,再看源代码。有的人喜欢一开始就看源代码,不过内核源码有900M
,就算是去除驱动相关代码也有400M
...