
Linux驱动
文章平均质量分 88
分享驱动知识与经验,Linux驱动从0开始学
苦梨甜
嵌入式全栈ing
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C语言中宏的一些高级用法举例
_mptr是成员 b 的首地址, 现在 减去成员 b 在结构体里面的偏移值,算出来的是不是这个结构体的首地址呀。而宏展开(函函数),是在编译时进行的,展开时是不分配内存,也没有返回值,也没有值传递。(5)宏替换只占用编译时间,不占用运行时间而函数调用占用的是运行时间(分配内存,传递参数,执行函数体)。(2) 用获取的变量类型,定义了一个指针变量 __mptr ,并且将成员变量 b 的首地址赋值给它。(1)函数调用时,先求出实参表达式的值,然后带入形参带参数的宏只进行简单的字符替换;原创 2023-04-04 14:58:06 · 1382 阅读 · 0 评论 -
用户空间与内核空间通信方式
get_user和put_user相对于copy_from_user和copy_to_user,这两个函数主要用来完成一些简单类型变量(char、int、long等)的拷贝任务,对于一些复合类型的变量,如数据结构或者数组类型,get_user和put_user函数则无法胜任:函数内部将对ptr所指向的对象长度进行检查,大部分平台只支持长度为1,2,4的变量。get_user将用户空间ptr指向的数据拷贝到内核空间的变量x中,函数如果成功则返回0,否则返回-EFAULT。原创 2023-03-06 22:04:56 · 452 阅读 · 0 评论 -
交叉编译环境搭建
ARM 裸机、 Uboot 移植、 Linux 移植这些都需要在 Ubuntu 下进行编译,编译就需要编译器,交叉编译器就是:1、它肯定是一个GCC 编译器。2、这个GCC 编译器是运行在X86 架构的 PC 上的。3、这个 GCC 编译器是编译 ARM 架构代码的,也就是编译出来的可执行文件是在 ARM 芯片上运行的交叉编译器有很多种,我们使用 Linaro 出品的交叉编译器。原创 2023-03-26 12:57:33 · 2497 阅读 · 0 评论 -
Linux驱动操作地址(寄存器)的一些方式
让程序跳转到绝对地址是0x100000去执行。对绝对地址0x100000赋值操作。使用typedef可以更直观。原创 2023-03-08 10:14:35 · 1612 阅读 · 0 评论 -
vivid源码分析
/ 根据次设备号从数组中得到video_device。下面调用到vivid_fops中的v4l2_fh_open函数(硬件相关层的函数)在ctrl_handler里找到v4l2_ctrl,返回它的值。该数组在__video_register_device中设置。根据次设备号从数组中得到video_device。根据APP传入的cmd来获得、设置"某些属性"// 调用驱动程序的ioctl函数。以次设备号为下标存起来。原创 2023-05-04 22:34:57 · 681 阅读 · 0 评论 -
v4l2框架
vivid_create_instance创建设备实例。匹配后调用vivid_probe。原创 2023-05-04 22:27:42 · 774 阅读 · 0 评论 -
pinctrl_desc结构体注册
首先,pinctrl_register_one_pin 函数用于注册单个引脚,它分配内存并初始化引脚描述符,然后将其插入到引脚描述符树中。其次,pinctrl_register_pins 函数用于注册一组引脚,它遍历引脚描述符数组并调用 pinctrl_register_one_pin 函数来逐个注册引脚。接着,函数会注册所有的引脚,调用 pinctrl_register_pins 函数进行引脚的注册。如果注册过程中发生错误,则会打印错误信息,释放已注册的引脚描述符,并跳转到错误处理标签 out_err。原创 2023-08-07 12:59:35 · 647 阅读 · 0 评论 -
pinctrl设备树节点映射详细分析imx_dt_node_to_map
这是一个名为 imx_dt_node_to_map 的函数,用于将设备树中的节点映射为引脚控制器的配置映射。以下是该函数的详细分析:首先,函数从引脚控制器设备结构体 pctldev 中获取指向 imx_pinctrl 结构体的指针 ipctl,以及指向 imx_pinctrl_soc_info 结构体的指针 info。函数查找节点 np 所属的引脚组,通过调用 imx_pinctrl_find_group_by_name 函数来查找。如果找不到组,则会打印错误信息并返回错误码 -EINVAL。原创 2023-08-07 12:57:49 · 1466 阅读 · 0 评论 -
pinctrl_desc函数操作集实现
它通过传入的引脚 ID,在 imx_pinctrl_soc_info 结构体中查找对应的寄存器配置信息,并将传入的配置值写入配置寄存器。对于每个具有配置的引脚,将配置映射的类型设置为 PIN_MAP_TYPE_CONFIGS_PIN,引脚名设置为引脚的名称,配置数组设置为引脚的配置,配置数量设置为 1。首先,函数从引脚控制器设备结构体 pctldev 中获取指向 imx_pinctrl 结构体的指针 ipctl,以及指向 imx_pinctrl_soc_info 结构体的指针 info。原创 2023-08-07 12:44:21 · 886 阅读 · 0 评论 -
pinctrl_desc函数操作集
这些函数指针定义了与引脚配置相关的操作,并提供了对引脚配置的获取、设置和调试显示功能的支持。gpio_set_direction: 由于控制器可能需要根据GPIO配置为输入或输出来进行不同的配置,因此可以实现方向选择器函数作为需要引脚复用的GPIO控制器的支持。初始化 imx_pinctrl_desc时得知函数操作集为imx_pctrl_ops,imx_pmx_ops,imx_pinconf_ops。pin_config_config_dbg_show: 调试时显示驱动程序的引脚配置参数。原创 2023-08-07 12:37:50 · 501 阅读 · 0 评论 -
pinctrl_desc结构体实现
使用 devm_kmalloc 函数分配内存,大小为 sizeof(*info->pin_regs) * info->npins,并将返回的内存指针赋值给 info->pin_regs。原创 2023-07-24 17:50:48 · 467 阅读 · 0 评论 -
pinctrl设备及其结构体
pinctrl_info 是一个指向 struct imx_pinctrl_soc_info 的指针,用于存储与设备匹配时需要使用的数据。这行代码使用 of_match_device 函数在设备树匹配数组 imx6ul_pinctrl_of_match 中查找与当前设备匹配的项。这行代码将匹配项中的 data 字段赋值给 pinctrl_info,并进行类型转换,使其指向 struct imx_pinctrl_soc_info 类型的数据。:指向引脚描述符数组的指针,描述了由该引脚控制器处理的所有引脚。原创 2023-07-24 17:46:13 · 277 阅读 · 0 评论 -
pinctrl 配置信息详解
这就是宏 MX6UL_PAD_UART1_RTS_B GPIO1_IO19 的含义,看的比较仔细的同学应该会发现并没有 conf_reg 寄存器的值,config_reg 寄存器是设置一个 PIN 的电气特性的,这么重要的寄存器怎么没有值呢?, 在 这 里 就 相 当 于 设 置IOMUXC_SW_MUX_CTL_PAD_UART1_RTS_B 寄存器为 0x5,也即是设置 UART1_RTS_B 这个 PIN 复用为GPIO1_IO19。原创 2023-07-24 17:42:27 · 662 阅读 · 0 评论 -
mjpg-streamer实现细节分析
如果调整后的格式不受支持,或者请求的格式为MJPEG并且设备不支持MJPEG模式,或者请求的格式为YUV并且设备不支持YUV模式,则打印错误消息,并跳转到fatal标签。将缓冲区 vd->buf 清零,并设置缓冲区的类型为视频捕获 (V4L2_BUF_TYPE_VIDEO_CAPTURE),内存类型为内存映射 (V4L2_MEMORY_MMAP)。如果输入格式为 V4L2_PIX_FMT_MJPEG,检查当前缓冲区的大小是否小于等于 HEADERFRAME1(宏定义的值),如果是,则输出警告信息并返回。原创 2023-05-25 14:01:28 · 1477 阅读 · 0 评论 -
mjpg-streamer框架分析
总体而言,该函数在一个独立的线程中运行,用于接受客户端的连接请求,并为每个连接创建一个新线程来处理客户端请求。其中,根据输入插件名称打开相应的动态链接库,获取插件的初始化、停止和运行函数指针,并调用初始化函数进行初始化。它接受一个整数id作为输入,表示服务器的ID。pthread_detach函数将线程标记为可分离的,这意味着线程的资源将在退出时自动释放,无需等待主线程的显式回收。总体来说,这个函数是一个简单的命令行程序,用于控制输入和输出插件的启动和运行,并提供一些选项来配置程序的行为。原创 2023-05-25 13:55:00 · 1890 阅读 · 0 评论 -
IMX6ULL平台I2C数据结构分析
在 i.MX 平台的 I2C 驱动中,存在多个相关的结构体,它们之间的联系和在内核中的作用如下:struct i2c_client:表示一个 I2C 从设备的结构体,用于描述从设备的信息。它包含了从设备的地址、名称、适配器等信息,并提供与从设备进行通信和交互的接口。struct i2c_adapter:表示一个 I2C 控制器适配器的结构体,用于管理 I2C 控制器的相关信息。它提供了控制器的配置、数据传输和中断处理等功能。原创 2023-05-24 12:54:35 · 1295 阅读 · 0 评论 -
IMX6ULL的I2C驱动详细分析
然后,在 i2c_adap_imx_exit 函数中,通过调用 platform_driver_unregister 函数来注销平台驱动 i2c_imx_driver。接下来,在 i2c_adap_imx_init 函数中,通过调用 platform_driver_register 函数来注册平台驱动 i2c_imx_driver。这段代码定义了一个名为 i2c_imx_driver 的平台驱动结构体,并实现了两个函数:i2c_adap_imx_init 和 i2c_adap_imx_exit。原创 2023-05-24 12:51:01 · 1016 阅读 · 0 评论 -
IMX6ULL平台的I2C
I2C是一种双线双向串行总线,它提供了一种简单、高效的数据交换方法,最大限度地减少了设备之间的互连。这种总线适用于需要在许多设备之间短距离偶尔进行通信的应用。灵活的I2C标准允许将额外的设备连接到总线以进行扩展和系统开发。请参见下图中的连接图。设备与I2C总线的连接I2C接口速度取决于I2C总线负载和时序特性。有关引脚要求的详细信息,请参阅I2C总线规范。I2C系统是一种真正的多主总线,包括仲裁和冲突检测,如果多个设备试图同时控制总线,则可以防止数据损坏。原创 2023-05-24 12:45:25 · 1657 阅读 · 0 评论 -
ov2640子设备视频操作详细分析
如果 mf->code 是 MEDIA_BUS_FMT_RGB565_2X8_BE 或 MEDIA_BUS_FMT_RGB565_2X8_LE,则选择 SRGB 颜色空间;flags 表示总线配置的标志,包括 V4L2_MBUS_PCLK_SAMPLE_RISING、V4L2_MBUS_MASTER、V4L2_MBUS_VSYNC_ACTIVE_HIGH、V4L2_MBUS_HSYNC_ACTIVE_HIGH 和 V4L2_MBUS_DATA_ACTIVE_HIGH。原创 2023-05-23 09:23:41 · 1965 阅读 · 0 评论 -
ov2640子设备核心操作详细分析
函数名为 i2c_smbus_xfer,接受一个 i2c_adapter 结构体指针 adapter、一个 u16 类型的地址 addr、一个 unsigned short 类型的标志位 flags、一个 char 类型的读写操作 read_write、一个 u8 类型的命令 command、一个 int 类型的协议 protocol,以及一个 union i2c_smbus_data 联合体指针 data 作为参数。它是一个通用的I2C传输函数,用于向I2C设备发送一系列消息,并返回传输的结果。原创 2023-05-23 09:20:08 · 1600 阅读 · 0 评论 -
CMOS摄像头驱动分析
初始化name字段,格式为"driver_name adapter_id-addr",其中driver_name是i2c_client的driver name,adapter_id是i2c_adapter的ID,addr是i2c_client的地址。如果控件类型是菜单(V4L2_CTRL_TYPE_MENU)、整数菜单(V4L2_CTRL_TYPE_INTEGER_MENU)或者复合类型(V4L2_CTRL_COMPOUND_TYPES),则设置处理器的错误信息为EINVAL,并返回空指针。原创 2023-05-23 09:16:26 · 1296 阅读 · 0 评论 -
CMOS摄像头驱动分析-i2c驱动
总的来说,module_i2c_driver(ov2640_i2c_driver)宏的作用是将ov2640_i2c_driver所定义的I2C驱动注册到系统中,以便系统能够正确识别和使用与OV2640摄像头相关的I2C通信功能。使用module_driver宏,传入__i2c_driver作为驱动参数,以及i2c_add_driver和i2c_del_driver作为注册和注销函数。module_i2c_driver是一个宏,它可能是在编程中定义的一个宏,用于简化I2C驱动模块的注册。原创 2023-05-23 09:07:59 · 1545 阅读 · 0 评论 -
UVC调用过程部分细节分析
VideoStreaming Interface用于获得视频数据,也可以用来选择fromat/frame(VS可能有多种format, 一个format支持多种frame, frame用来表示分辨率等信息)// 获取视频流格式,等数据,uvc_ioctl_reqbufs->uvc_request_buffers->vb2_reqbuf->__reqbufs分配缓冲区。video->streaming->type 应该是在设备被枚举时分析描述符时设置的。应是设备被枚举时设置的,也就是分析它的描述符时设置的。原创 2023-05-22 13:45:24 · 1286 阅读 · 0 评论 -
USB摄像头描述符参数获取和来源分析
Interface Descriptor(接口描述符):用于描述USB设备中的一个接口,包括接口号、接口类别、子类别、协议等信息。VideoControl Interface Descriptor(视频控制接口描述符):描述支持摄像头控制功能的接口,例如调整设置、控制曝光、对焦、白平衡等。VideoStreaming Interface Descriptor(视频流接口描述符):描述支持视频流传输的接口,指定视频流的设置和参数,如分辨率、帧率、压缩类型等。Endpoint Descriptor(端点描述符)原创 2023-05-22 13:29:54 · 753 阅读 · 0 评论 -
uvc驱动ioctl分析下
它们的作用是调用 uvc_ioctl_s_try_ext_ctrls 函数,将控制的设置操作交给 uvc_ioctl_s_try_ext_ctrls 函数处理,并指定 commit 参数为 false,表示不提交控制。总的来说,uvc_ioctl_g_input 函数用于获取当前视频输入源的索引。调用 uvc_ioctl_s_try_ext_ctrls 函数,将控制的设置操作交给 uvc_ioctl_s_try_ext_ctrls 函数处理,并指定 commit 参数为 true,表示提交控制。原创 2023-05-22 13:06:13 · 2004 阅读 · 0 评论 -
uvc驱动ioctl分析上
其中,uvc_ioctl_s_fmt_vid_cap 用于处理视频输入流的 IOCTL 命令,而 uvc_ioctl_s_fmt_vid_out 用于处理视频输出流的 IOCTL 命令。函数根据驱动程序的能力和用户空间的请求,分配相应数量的缓冲区,并更新队列的状态和缓冲区数量。这两个函数 uvc_ioctl_enum_fmt_vid_cap 和 uvc_ioctl_enum_fmt_vid_out 都是用于处理 V4L2 设备的枚举视频格式(enum_fmt)的 ioctl 操作。原创 2023-05-22 12:59:07 · 1934 阅读 · 0 评论 -
v4l2数据结构分析
在 v4l2(Video4Linux2)驱动中,存在多个相关的结构体,它们之间的联系和在内核中的作用如下:struct v4l2_device:表示一个 v4l2 设备的结构体,用于管理和描述 v4l2 设备的信息。它包含了设备的名称、子设备列表、控制处理器等信息,并提供了与设备注册、初始化和资源管理等功能。struct media_device:表示一个媒体设备的结构体,在 v4l2 中用于媒体控制器的管理。它包含了媒体实体和连接图的信息,并提供了与媒体设备注册、初始化和资源管理等功能。原创 2023-05-21 10:22:18 · 1475 阅读 · 0 评论 -
uvc驱动中的v4l2
这个数组的作用是提供了 IOCTL 命令的映射关系,当用户空间的应用程序通过系统调用 ioctl() 向视频设备驱动程序发送 IOCTL 命令时,内核可以通过查询这个数组,找到对应的处理函数来执行相应的操作。它调用__video_register_device函数,将warn_if_nr_in_use参数设置为1,这意味着如果所需的设备节点号已经被使用,将发出警告。总的来说,这个函数主要负责处理视频设备的用户空间和内核空间之间的数据传输,以及执行相应的ioctl命令,并确保数据的正确性和完整性。原创 2023-05-21 10:07:33 · 1049 阅读 · 0 评论 -
uvc摄像头驱动uvc设备的注册分析
结构体 const struct v4l2_ioctl_ops uvc_ioctl_ops 定义了与视频设备 IOCTL 请求相关的函数指针,它的作用是为 UVC(USB Video Class)驱动程序提供对视频设备的控制接口。结构体 const struct v4l2_file_operations uvc_fops 定义了与视频设备文件操作相关的函数指针,它的作用是为 UVC(USB Video Class)驱动程序提供视频设备文件的操作接口。原创 2023-05-20 11:58:30 · 2301 阅读 · 0 评论 -
usb摄像头驱动-core层usb设备的注册
在ubuntu中接入罗技c920摄像头打印的信息如下:在内核中,/driver/usb/core/driver.c 文件扮演了 USB 核心驱动程序管理的重要角色。该文件包含了 USB 核心驱动程序的实现,负责管理和调度 USB 设备的注册、匹配、连接和断开等操作。具体而言,driver.c 文件的功能和作用包括:USB 驱动程序的注册和注销:该文件实现了 usb_register_driver 和 usb_deregister_driver 函数,用于注册和注销 USB 驱动程序。原创 2023-05-19 21:01:02 · 795 阅读 · 0 评论 -
media设备节点初始化与Video4Linux初始化
在函数的实现中,它会调用media_device_register_entity函数来注册媒体设备实体,然后调用media_devnode_register函数来创建并注册设备节点。总结而言,videodev_init函数的作用是初始化视频设备框架(Video4Linux),注册相关的设备、驱动程序和功能,以便用户空间应用程序可以使用Video4Linux API访问和控制视频设备。media_devnode_init函数是一个内核初始化函数,用于在Linux内核启动期间进行设备节点初始化。原创 2023-05-19 20:57:34 · 935 阅读 · 0 评论 -
usb摄像头驱动-core层USB集线器(Hub)驱动
在USB摄像头驱动中,hub.c文件扮演着USB集线器(Hub)驱动的角色。USB集线器是用于连接多个USB设备的设备,它提供了额外的USB端口,并负责数据传输的分配和管理。hub.c文件中的内容主要涉及USB集线器的初始化、事件处理、数据传输和管理等功能。以下是该文件中常见的功能和作用的概括:总体而言,hub.c文件中的内容实现了USB摄像头驱动中与USB集线器相关的功能,包括集线器的初始化、事件处理、数据传输和管理等。原创 2023-05-18 19:23:59 · 2870 阅读 · 0 评论 -
usb摄像头驱动打印信息
后面将根据打印的信息来分析摄像头相关的驱动。分析一下这些打印信息。原创 2023-05-18 19:10:56 · 1093 阅读 · 0 评论 -
将虚拟机dmesg日志内容通过串口输出到windows下文件中
设置ubuntu让它从串口0输出printk信息。原创 2023-05-14 21:28:57 · 1270 阅读 · 0 评论 -
通过sysfs文件系统接口来改变内核模块中的变量值(二)
给出一个完整的源码来展示如何创建、初始化并向系统中添加一个对象,以及如何通过sysfs文件系统接口在用户空间和内核空间进行沟通,另一个有趣的事情是它通过/sbin/hotplug机制来通知用户空间某一个kobject状态的变化。在这个例子中,我们将用自己编译的一个应用程序取代系统的/sbin/hotplug,该应用程序会打出一些环境变量,记在/var/log/messages文件中。原创 2023-03-17 13:24:47 · 226 阅读 · 0 评论 -
内核链表分析
依此类推,每次插入的新节点都是紧挨着 header_task 表尾,而插入的第一个节点 my_first_task 排在了第一位, my_second_task 排在了第二位,可得出:先插入的节点排在前面,后插入的节点排在后面, “先进先出,后进后出” ,这不正是队列的特点吗(First in First out)!获取下一个宿主结构的地址。我们真正更关心的是包含 list_head 这个结构体字段的宿主结构体,因为只有定位到了宿主结构体的起始地址,我们才能对对宿主结构体中的其它有意义的字段进行操作。原创 2023-03-10 19:41:08 · 943 阅读 · 0 评论 -
点灯大师--IMX.6ULL阿尔法开发板点灯的步骤和五种方式
找到 GPIO1_IO03 的复用寄存器“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03”的地址为0X020E0068,然后设置此寄存器,将 GPIO1_IO03 这个 IO 复用为 GPIO 功能,也就是 ALT5。找到 GPIO1_IO03 的配置寄存器“IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03”的地址为0X020E02F4,根据实际使用情况,配置此寄存器。某个引脚,或是某组预设的引脚,都有 8 个可选的模式(alternate (ALT)MUX_MODE)。原创 2023-03-08 10:06:17 · 1267 阅读 · 0 评论 -
按键消抖的两种方法--中断延迟工作与定时器
按键由于物理特性,按下瞬间会多次置为 1/0,俗称抖动。所以我们需要给一个合理的延时,来判断是否按下按钮,为了实现这个延时我们可以使用中断延迟工作和定时器来实现,下面是具体实现的方法。原创 2023-03-23 19:02:07 · 2229 阅读 · 1 评论 -
通过sysfs文件系统接口来改变内核模块中的变量值(一)--通过fasync实现
下面用一个具体的例子来展示设备驱动程序如何实现fasync方法,以及应用程序如何得到来自设备驱动程序的异步通知。这个例了同时也展示了sysfs文件系统在驱动程序中的用法,以及通过Linux设各模型来创建设备节点及其他一些特性(这个看起来很简单的内核模块其实体现了设备驱动程序中一些比较重要且典型的特征)。原创 2023-03-14 19:42:16 · 275 阅读 · 0 评论 -
休眠与唤醒
当应用程序必须等待某个时间发生,比如必须等待按键被按下时,可以使用“休眠-唤醒”机制,这一机制近似于,你是个早起困难户,想要早起,必须等待闹钟响了,才会起床。原创 2022-11-05 21:14:35 · 2749 阅读 · 0 评论