Linux驱动
文章平均质量分 89
分享驱动知识与经验,Linux驱动从0开始学
苦梨甜
嵌入式全栈ing
展开
-
pinctrl_desc结构体注册
首先,pinctrl_register_one_pin 函数用于注册单个引脚,它分配内存并初始化引脚描述符,然后将其插入到引脚描述符树中。其次,pinctrl_register_pins 函数用于注册一组引脚,它遍历引脚描述符数组并调用 pinctrl_register_one_pin 函数来逐个注册引脚。接着,函数会注册所有的引脚,调用 pinctrl_register_pins 函数进行引脚的注册。如果注册过程中发生错误,则会打印错误信息,释放已注册的引脚描述符,并跳转到错误处理标签 out_err。原创 2023-08-07 12:59:35 · 518 阅读 · 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 · 883 阅读 · 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 · 437 阅读 · 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 · 324 阅读 · 0 评论 -
pinctrl_desc结构体实现
使用 devm_kmalloc 函数分配内存,大小为 sizeof(*info->pin_regs) * info->npins,并将返回的内存指针赋值给 info->pin_regs。原创 2023-07-24 17:50:48 · 286 阅读 · 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 · 201 阅读 · 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 · 449 阅读 · 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 · 1221 阅读 · 0 评论 -
mjpg-streamer框架分析
总体而言,该函数在一个独立的线程中运行,用于接受客户端的连接请求,并为每个连接创建一个新线程来处理客户端请求。其中,根据输入插件名称打开相应的动态链接库,获取插件的初始化、停止和运行函数指针,并调用初始化函数进行初始化。它接受一个整数id作为输入,表示服务器的ID。pthread_detach函数将线程标记为可分离的,这意味着线程的资源将在退出时自动释放,无需等待主线程的显式回收。总体来说,这个函数是一个简单的命令行程序,用于控制输入和输出插件的启动和运行,并提供一些选项来配置程序的行为。原创 2023-05-25 13:55:00 · 1669 阅读 · 0 评论 -
IMX6ULL平台I2C数据结构分析
在 i.MX 平台的 I2C 驱动中,存在多个相关的结构体,它们之间的联系和在内核中的作用如下:struct i2c_client:表示一个 I2C 从设备的结构体,用于描述从设备的信息。它包含了从设备的地址、名称、适配器等信息,并提供与从设备进行通信和交互的接口。struct i2c_adapter:表示一个 I2C 控制器适配器的结构体,用于管理 I2C 控制器的相关信息。它提供了控制器的配置、数据传输和中断处理等功能。原创 2023-05-24 12:54:35 · 1128 阅读 · 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 · 909 阅读 · 0 评论 -
IMX6ULL平台的I2C
I2C是一种双线双向串行总线,它提供了一种简单、高效的数据交换方法,最大限度地减少了设备之间的互连。这种总线适用于需要在许多设备之间短距离偶尔进行通信的应用。灵活的I2C标准允许将额外的设备连接到总线以进行扩展和系统开发。请参见下图中的连接图。设备与I2C总线的连接I2C接口速度取决于I2C总线负载和时序特性。有关引脚要求的详细信息,请参阅I2C总线规范。I2C系统是一种真正的多主总线,包括仲裁和冲突检测,如果多个设备试图同时控制总线,则可以防止数据损坏。原创 2023-05-24 12:45:25 · 1023 阅读 · 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 · 1626 阅读 · 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 · 1267 阅读 · 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 · 968 阅读 · 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 · 1202 阅读 · 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 · 801 阅读 · 0 评论 -
USB摄像头描述符参数获取和来源分析
Interface Descriptor(接口描述符):用于描述USB设备中的一个接口,包括接口号、接口类别、子类别、协议等信息。VideoControl Interface Descriptor(视频控制接口描述符):描述支持摄像头控制功能的接口,例如调整设置、控制曝光、对焦、白平衡等。VideoStreaming Interface Descriptor(视频流接口描述符):描述支持视频流传输的接口,指定视频流的设置和参数,如分辨率、帧率、压缩类型等。Endpoint Descriptor(端点描述符)原创 2023-05-22 13:29:54 · 671 阅读 · 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 · 1455 阅读 · 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 · 1362 阅读 · 0 评论 -
v4l2数据结构分析
在 v4l2(Video4Linux2)驱动中,存在多个相关的结构体,它们之间的联系和在内核中的作用如下:struct v4l2_device:表示一个 v4l2 设备的结构体,用于管理和描述 v4l2 设备的信息。它包含了设备的名称、子设备列表、控制处理器等信息,并提供了与设备注册、初始化和资源管理等功能。struct media_device:表示一个媒体设备的结构体,在 v4l2 中用于媒体控制器的管理。它包含了媒体实体和连接图的信息,并提供了与媒体设备注册、初始化和资源管理等功能。原创 2023-05-21 10:22:18 · 1194 阅读 · 0 评论 -
uvc驱动中的v4l2
这个数组的作用是提供了 IOCTL 命令的映射关系,当用户空间的应用程序通过系统调用 ioctl() 向视频设备驱动程序发送 IOCTL 命令时,内核可以通过查询这个数组,找到对应的处理函数来执行相应的操作。它调用__video_register_device函数,将warn_if_nr_in_use参数设置为1,这意味着如果所需的设备节点号已经被使用,将发出警告。总的来说,这个函数主要负责处理视频设备的用户空间和内核空间之间的数据传输,以及执行相应的ioctl命令,并确保数据的正确性和完整性。原创 2023-05-21 10:07:33 · 896 阅读 · 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 · 1743 阅读 · 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 · 609 阅读 · 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 · 746 阅读 · 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 · 2181 阅读 · 0 评论 -
usb摄像头驱动打印信息
后面将根据打印的信息来分析摄像头相关的驱动。分析一下这些打印信息。原创 2023-05-18 19:10:56 · 772 阅读 · 0 评论 -
将虚拟机dmesg日志内容通过串口输出到windows下文件中
设置ubuntu让它从串口0输出printk信息。原创 2023-05-14 21:28:57 · 957 阅读 · 0 评论 -
通过sysfs文件系统接口来改变内核模块中的变量值(二)
给出一个完整的源码来展示如何创建、初始化并向系统中添加一个对象,以及如何通过sysfs文件系统接口在用户空间和内核空间进行沟通,另一个有趣的事情是它通过/sbin/hotplug机制来通知用户空间某一个kobject状态的变化。在这个例子中,我们将用自己编译的一个应用程序取代系统的/sbin/hotplug,该应用程序会打出一些环境变量,记在/var/log/messages文件中。原创 2023-03-17 13:24:47 · 170 阅读 · 0 评论 -
内核链表分析
依此类推,每次插入的新节点都是紧挨着 header_task 表尾,而插入的第一个节点 my_first_task 排在了第一位, my_second_task 排在了第二位,可得出:先插入的节点排在前面,后插入的节点排在后面, “先进先出,后进后出” ,这不正是队列的特点吗(First in First out)!获取下一个宿主结构的地址。我们真正更关心的是包含 list_head 这个结构体字段的宿主结构体,因为只有定位到了宿主结构体的起始地址,我们才能对对宿主结构体中的其它有意义的字段进行操作。原创 2023-03-10 19:41:08 · 716 阅读 · 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 · 750 阅读 · 0 评论 -
按键消抖的两种方法--中断延迟工作与定时器
按键由于物理特性,按下瞬间会多次置为 1/0,俗称抖动。所以我们需要给一个合理的延时,来判断是否按下按钮,为了实现这个延时我们可以使用中断延迟工作和定时器来实现,下面是具体实现的方法。原创 2023-03-23 19:02:07 · 1537 阅读 · 1 评论 -
通过sysfs文件系统接口来改变内核模块中的变量值(一)--通过fasync实现
下面用一个具体的例子来展示设备驱动程序如何实现fasync方法,以及应用程序如何得到来自设备驱动程序的异步通知。这个例了同时也展示了sysfs文件系统在驱动程序中的用法,以及通过Linux设各模型来创建设备节点及其他一些特性(这个看起来很简单的内核模块其实体现了设备驱动程序中一些比较重要且典型的特征)。原创 2023-03-14 19:42:16 · 200 阅读 · 0 评论 -
休眠与唤醒
当应用程序必须等待某个时间发生,比如必须等待按键被按下时,可以使用“休眠-唤醒”机制,这一机制近似于,你是个早起困难户,想要早起,必须等待闹钟响了,才会起床。原创 2022-11-05 21:14:35 · 2511 阅读 · 0 评论 -
如何让系统在板子上跑起来(基于阿尔法开发板-imx6ull)
前提条件:1:已经下载好对应的内核源码和uboot源码;2:已经搭建好根文件系统;3:网络环境已经配置好。正点原子提供的虚拟机已经具备1和2。原创 2022-11-04 20:53:53 · 890 阅读 · 0 评论 -
makefile实现创建目录和复制.ko文件
如果已经创建了对应项目的目录就不需要·make file了。原创 2022-10-31 14:54:38 · 1579 阅读 · 0 评论 -
设备树一
设备树是采用树形结构来描述板子上的设备信息的文件,每个设备都是一个节点,叫做设备节点,每个节点都通过一些属性信息来描述节点信息,属性就是键—值对。节点是由一堆的属性组成,节点都是具体的设备,不同的设备需要的属性不同,用户可以自定义属性。除了用户自定义属性,有很多属性是标准属性, Linux 下的很多外设驱动都会使用这些标准属性。原创 2022-11-07 22:43:52 · 733 阅读 · 0 评论 -
RCU
RCU的全称是Read-Copy-Update,意即读丐一复制一更新,在Linux提供的所有内核互斥设施当中属于一种免锁机制·同前面讨论过的读取者与写入者自旋锁rwlock、读取者与写入者信号量rwsem以及顺序锁seqlock一样,RCU的适用模型也是读取者与写入者共存的系统。原创 2023-03-10 19:53:35 · 950 阅读 · 0 评论 -
顺序锁seqlock
在此基础上sequence提供的另外一个信息是写入过程有没有结束,这是用sequence的最低位来完成的,如果sequence & 0为0表明写入过程己经结束,否则表明写入过程正在进行·接下来会在读取者的seqlock作数中看到sequence的这两种用途。读取者在开始读取前读取该sequence,在读取后再重读该值,如果与之前读取到的值不一致,则说明本次读取作过程中发生了数据更新,读取操作无效,因此要求写入者在开始写入的时候要更新sequence的值。写入者与写入者之间并不需要sequence。原创 2023-03-10 19:50:29 · 594 阅读 · 0 评论 -
Linux开发环境配置详细过程--正点原子阿尔法开发板
编辑->虚拟网络编辑器设置->更改设置->添加网络VMnet0并设置为桥接模式->保存后还原默认设置。上述设置后Ubuntu中会有两个网卡的信息,一个用来让Ubuntu上网,另一个用于为开发板提供网络。配置ens38网卡信息与前面虚拟网络编辑器中NAT模式的网卡信息在同一子网下。编辑虚拟机设置->添加->网络适配器->设置添加的网络适配器为NAT模式。设置开发板为sd卡启动,上电启动uboot,进入uboot命令模式。如图所示,网卡ens38让虚拟机上网,ens33为开发板提供网络。重新加载网络配置文件。原创 2023-03-06 21:46:03 · 1936 阅读 · 0 评论