- 博客(31)
- 收藏
- 关注
原创 驱动开发学习
引用:40.1字符驱动设备简介应用程序(调用open()函数)库(C库中的open()函数)内核(open()系统调用)驱动程序(驱动open()函数)硬件举例LED:Open函数打开/dev/led,close函数关闭/dev/led, wirte函数向此驱动写入数据(点亮或关闭led),read函数可以从驱动中读取led的状态。
2024-12-04 10:58:03
562
原创 spi学习
1.spi(Serial Peripheral Interface)串行外围设备接口。在芯片管脚上占用四根线。2.spi模式:spi分为主从两种模式,一个spi通讯系统需要包含一个主设备,一个或者多个从设备。提供时钟的为主设备,接收时钟的设备为从设备。spi的读写操作都是由主设备发起的。
2024-12-04 10:57:28
416
原创 PWM学习笔记
PWM 全称是 Pulse Width Modulation,也就是脉冲宽度调制。频率和占空比:频率就是开关速度,把一次开关算作一个周期,那么频率就是 1 秒内进行了多少次开关。占空比就是一个周期内高电平时间和低电平时间的比例,一个周期内高电平时间越长占空比就越大,反之占空比就越小。占空比用百分之表示,如果一个周期内全是低电平那么占空比就是 0%,如果一个周期内全是高电平那么占空比就是100%。PWM信号:周期T(Period):一个完整PWM波形所持续的时间。
2024-12-04 10:56:52
387
原创 LInux调试技术之内核崩溃
Linux 是一种自由和开放源码的类 UNIX 操作系统,由林纳斯·托瓦兹在1991年赫尔辛基大学上学时创立的,主要受到 Minix 和 Unix 思想的启发。Linux 遵循 GNU 通用公共许可证(GPL),任何个人和机构都可以自由地使用 Linux 的所有底层源代码,也可以自由地修改和再发布。由于 Linux 是自由软件,任何人都可以创建一个符合自己需求的 Linux 发行版。Linux社区(官网链接)提供了多种发行版本,也可以下载最新Linux内核源码(官网链接。
2024-12-04 10:56:18
521
原创 i2c学习文档
在I2C总线驱动i2c_bus_type的match()函数i2c_device_match()中,会调用i2c_match_id()函数匹配在板文件中定义的ID和i2c_driver所支持的ID表。实现I2C硬件体系结构中适配器端,适配器可由CPU控制,或直接集成在CPU内部。i2c_driver对应于一套驱动方法,其主要成员函数是probe()、remove()、suspend()、resume()等, struct i2c_device_id形式的id_table是该驱动所支持的I2C设备的ID表。
2024-12-04 10:55:46
414
原创 c语言知识点归纳.md
25.十六进制数制使用0到9和A到F来表示值,其中A代表10,B代表11,C代表12,D代表13,E代表14,F代表15。atoi 将字符串转换为相应的整数值,从字符串的开头开始,直到遇到不能转换为数字的字符为止。按位与AND:对于两个数的每一位,只有当两位都为1时,结果位才为1,否则为0。按位或OR:对于两个操作数的每一位,只要有一个位为1,结果位就为1,否则为0。按位取反NOT:对操作数的每一位进行取反操作,即把1变为0,把0变为1。函数接收的是实际参数的地址,可以通过地址修改实际参数的值。
2024-12-04 10:52:52
450
原创 c语言学习文档.md
1.1 进程概念: 进程是指在计算机系统中运行的一个程序的实例。每个进程都拥有自己独立的内存空间,包括代码、数据和栈等。进程之间相互独立,彼此不能直接干涉对方的内部信息,但可以通过操作系统提供的机制进行通信和协同工作。进程间通信:不同进程之间进行数据交换和信息传递的机制管道(Pipe):管道是一种半双工的通信方式,通常用于具有亲缘关系的父子进程之间进行通信。消息队列(Message Queue):消息队列是一种通过消息传递进行通信的方式,允许不同进程之间通过将消息发送到队列中来进行通信。共享内存(Share
2024-12-04 10:52:15
716
原创 Spi22
如果您的SPI控制器自动处理CS引脚,可能需要修改SPI控制器的设置,或者使用`spi_transfer`结构体中的`cs_change`字段和延时配置。- `hik208_start_image_capture()`函数读取寄存器`0x10`以启动采图,确认返回值为`0x00`。- **指纹数据采图**:读寄存器`0xF0`,若返回的值为`0x00`,为无效数据,只有非零数据才是有效的指纹数据。- `hik208_read_image_data()`函数实现了多字节读操作,用于读取指纹图像数据。
2024-11-18 11:29:49
438
原创 来源1111
通过科学有效的管理,企业能够安全地利用开源软件的优势,同时规避可能的法律和安全问题。社区审查的质量保证:开源组件通常由大量的开发人员和用户群体使用和测试,通过开源软件管理选择合适的组件,可以保证这些组件的质量相对较高,减少软件中的bug。通过有效的开源软件管理,企业不仅能够减少风险和提高效率,还能够提升软件质量,简化审计过程,促进团队协作,从而最大化地利用开源软件的优势并降低其潜在的风险。可靠的供应链:通过开源管理工具,企业可以追踪其开源软件的来源,确保依赖的组件来源于可信的供应链,减少供应链攻击的风险。
2024-11-07 09:29:02
377
原创 不需要用户输入
/ beeppwm_msgs: 处理蜂鸣器对象的任何附加消息(当前无操作)。// beeppwm_create: 分配并初始化一个新的蜂鸣器对象。// beeppwm_destroy: 释放为蜂鸣器对象分配的内存。// 使用 write() 将打开命令发送到蜂鸣器设备。// 使用 write() 将关闭命令发送到蜂鸣器设备。// beeppwm_start: 打开蜂鸣器设备文件并初始化。// beeppwm_end: 关闭蜂鸣器设备文件以释放资源。// 预设打开蜂鸣器操作。// 打开蜂鸣器设备文件。
2024-10-25 22:17:27
369
原创 skt 无报警时长
len = snprintf(buf, sizeof(buf), "请输入蜂鸣器操作(1=开, 0=关)\n");// beep_create: 分配并初始化一个新的蜂鸣器对象。// 使用 write() 将命令发送到蜂鸣器设备。// beep_start: 打开蜂鸣器设备文件并初始化。// beep_run: 根据用户输入控制蜂鸣器的操作。// beep_end: 关闭蜂鸣器设备文件以释放资源。// 提示用户输入命令(开/关)。// 解析命令(开/关)。// 打开蜂鸣器设备文件。// 初始化文件描述符。
2024-10-25 20:14:10
271
原创 skt beep
len = snprintf(buf, sizeof(buf), "请输入蜂鸣器操作(1=开, 0=关)和延迟秒数(例如: 1 5)\n");len = snprintf(buf, sizeof(buf), "报警时长 %d 秒\n", delaySec);printf("错误: 命令: 0=关, 1=开\n");// 使用 write() 将命令发送到蜂鸣器设备。// beep_run: 根据用户输入控制蜂鸣器的操作。// 提示用户输入命令(开/关)和可选的延迟时间。// 解析命令(开/关)和延迟时间。
2024-10-25 19:47:59
338
原创 在read,write写ack
作为一名Linux驱动开发工程师,您编写的GPIO模拟I2C代码已经具备了基本的读写功能。然而,目前的`rtl8367_i2c_transfer`和`switch_test`函数在处理ACK(确认信号)方面存在一些不足。为了确保I2C通信的可靠性和正确性,需要对这些函数进行改进,特别是在ACK处理部分。以下是针对您的需求的详细修改建议和代码实现:## 1. 改进`i2c_write_byte`和`i2c_read_byte`函数以处理ACK首先,确保在每次写入字节后读取ACK信号,并在读取字节后发送ACK或
2024-09-26 22:28:00
1386
原创 直接写在transfer
通过在`rtl8367_i2c_transfer`和`switch_test`函数中手动添加ACK的处理步骤,您可以在不修改现有的`i2c_read_byte`和`i2c_write_byte`函数的情况下,增强I2C通信的可靠性和稳定性。明白了,您希望在不修改现有的 `i2c_read_byte` 和 `i2c_write_byte` 函数的情况下,改进 `rtl8367_i2c_transfer` 和 `switch_test` 函数,以更好地处理ACK(确认信号)。// 设置SDA为输出。
2024-09-26 22:26:56
832
原创 封装ack的
明白了,您希望在不修改现有的 `i2c_read_byte` 和 `i2c_write_byte` 函数的情况下,将读取ACK的代码封装到一个独立的函数中,并在 `rtl8367_i2c_transfer` 和 `switch_test` 函数中调用该封装函数。通过将读取ACK的过程封装到 `i2c_read_ack` 函数中,并在 `rtl8367_i2c_transfer` 和 `switch_test` 函数中调用该函数,您可以显著提高代码的可读性和可维护性。// 原有代码发送ACK。
2024-09-26 22:26:24
371
原创 10。1完整驱动
接下来,我们将根据您的需求,**实现RTL8367网口速率查询接口**,并**集成RTL8367芯片SDK支持IOCTL获取**,替换现有的`write`函数。- **RAII(资源获取即初始化)**:确保每一个`gpio_request`都有对应的`gpio_free`,每一个`alloc_chrdev_region`都有对应的`unregister_chrdev_region`。确保`rtl8367_driver_main.c`包含了驱动的主要逻辑,而`rtl8367_sdk.c`包含SDK的实现。
2024-09-25 20:51:55
1030
原创 网口查询不一定对
``cif (ret!return -1;return 10;return 100;default:return -1;return 0;```
2024-09-25 00:52:48
643
原创 根据时序改
1. **I2C 时序逻辑修改**:所有涉及到 I2C 时序的部分,如 `i2c_start`、`i2c_stop`、`i2c_write_byte`、`i2c_read_byte` 函数,按照新的时序进行了修改,确保符合 I2C 标准。// 初始化 I2C GPIO。// 发送 NACK。
2024-09-24 23:42:25
450
原创 完整sdk 读写 查速率
define RTL8367_IOC_GET_PORT_SPEED _IOWR(RTL8367_IOC_MAGIC, 3, struct port_speed_data) // 网口速率获取。// 发送 NACK。
2024-09-24 00:04:15
544
原创 客户端i2c8367
基于你提供的 RTL8367 I2C GPIO 驱动,我们可以创建一个简单的用户空间程序来与该驱动进行交互,执行 I2C 读写操作,并查询网口速率。- `i2c_write`: 通过 IOCTL 发送 I2C 写请求,指定总线 ID、设备地址、寄存器地址和要写入的数据。- `i2c_read`: 通过 IOCTL 发送 I2C 读请求,指定总线 ID、设备地址、寄存器地址,读取寄存器值。- `get_port_speed`: 通过 IOCTL 查询 RTL8367 的网口速率。// I2C 设备地址。
2024-09-23 23:50:55
765
原创 上一篇注释版
**i2c_write_byte / i2c_read_byte**: 这是通过 GPIO 模拟 I2C 通信的函数。case RTL8367_IOC_GET_PORT_SPEED: // 处理网口速率查询。
2024-09-23 23:45:32
458
原创 8367读写
在 `RTL8367_init` 函数中,如果 `gpio_request` 或 `gpio_direction_output` 失败,我们会在 `goto` 语句中释放 GPIO 资源。`unlocked_ioctl` 函数已经处理得当,确保在用户空间和内核空间之间传递数据时,使用 `copy_from_user` 和 `copy_to_user` 来进行安全的数据传输。1. `RTL8367_IOC_I2C_READ` 和 `RTL8367_IOC_I2C_WRITE` 的处理分别完成。
2024-09-23 23:36:41
456
原创 设备树怎么写
**注意**:`pins` 的命名方式(如 `"gpio1_5"`, `"gpio1_6"`)取决于具体的硬件平台和设备树绑定规范,请参考您平台的设备树文档进行调整。- **`i2c1scl-gpio` 和 `i2c1sda-gpio`**:定义用于 I2C 时钟线(SCL)和数据线(SDA)的 GPIO 引脚。- **`i2c1scl-gpio` 和 `i2c1sda-gpio`**:定义用于 I2C 的 SCL 和 SDA GPIO 引脚。// 与驱动程序中的 compatible 字符串匹配。
2024-09-22 22:56:43
481
原创 一种使用ioctl输入这三个地址,进行客户端交互。第二种是直接把这三个数据写死在里面,只读这三个数据
**`struct i2c_read_data`**:用于在用户空间和内核空间之间传递 `bus_id`、`i2c_addr`、`register_address` 和读取的数据 `data`。在这种方案中,驱动内部直接使用固定的 `bus_id`、`i2c_addr` 和 `register_address`,无需用户通过 `ioctl` 传入。## 方案一:使用 `ioctl` 接口输入 `bus_id`、`i2c_addr` 和 `register_address` 进行客户端交互。
2024-09-22 22:55:00
894
原创 基于 GPIO 模拟 I2C 协议
4. **创建设备类和设备节点**:使用 `class_create` 和 `device_create` 创建设备类和设备节点,以便用户态可以通过 `/dev/RTL8367_RW` 访问。- **`RTL8367_IOC_I2C_WRITE` 和 `RTL8367_IOC_I2C_READ`**:定义 I2C 写和读的 IOCTL 命令。- 使用 `of_get_named_gpio` 获取 `i2c1scl-gpio` 和 `i2c1sda-gpio` 的 GPIO 编号。以下是一个简单的示例。
2024-09-22 22:46:42
2104
原创 11基于18101主板根据RTL8367手册,完成GPIO模拟I2C,实现RTL8367寄存器状态获取
好的,作为一名Linux驱动开发工程师,我将帮助你在现有的GPIO驱动基础上,基于18101主板和RTL8367手册,实现GPIO模拟I2C,并获取RTL8367的寄存器状态。在初始化函数中调用`rtl8367_sysfs_init()`,在卸载函数中调用`rtl8367_sysfs_exit()`。
2024-09-22 21:10:51
1900
原创 I2C读写驱动客户端
命令号 (I2C_IOCTL_READ 和 I2C_IOCTL_WRITE):通过宏定义,I2C_IOCTL_READ 和 I2C_IOCTL_WRITE 被替换为具体的数值(分别为 1 和 2)。在 ioctl 函数调用中,I2C_IOCTL_READ 和 I2C_IOCTL_WRITE 是宏定义的常量,它们的值分别为 1 和 2。在你的代码中,这就是 I2C_IOCTL_READ(等于1)和 I2C_IOCTL_WRITE(等于2)。
2024-09-14 08:40:27
493
原创 I2C读写驱动
/ 打印读取到的数据。#define I2C_IOCTL_READ 1 // 命令号1用于读取。#define I2C_IOCTL_WRITE 2 // 命令号2用于写入。// 用于存储读取或写入的数据。// I2C寄存器地址。// I2C总线ID。// I2C从机地址。// 使用和驱动中定义的固定IOCTL命令号。// 使用IOCTL命令执行读取操作。// 使用IOCTL命令执行写入操作。// 打开i2c驱动设备文件。// 打开i2c驱动设备文件。// I2C 读取函数。// I2C 写入函数。
2024-09-14 08:38:46
317
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人