在 x86_64 上添加 i2c 客户端设备

2023-12-04

在我的 x86_64 板上,有来自 MFD 设备的 i2c 总线。此 i2c 总线上有设备。我能够使用 i2cDetect 程序检测这些设备。

# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- 4c -- -- -- 
50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         

我需要内核自动检测这些设备,因此,我尝试按照下面给出的代码编写 i2c_board_info ,但是内核仍然无法自动检测这些设备。

#include <linux/init.h>
#include <linux/i2c.h>

#define BUS_NUMBER      0

static struct __init i2c_board_info tst_i2c0_board_info[]  = {                   
    {
        I2C_BOARD_INFO("ltc2990", 0x4c),
    },
    {
        I2C_BOARD_INFO("24c128", 0x57),
    },
};

static int tst_i2c_board_setup(void)
{
    int ret=-1;
    ret = i2c_register_board_info(BUS_NUMBER, tst_i2c0_board_info, ARRAY_SIZE(tst_i2c0_board_info));
    return ret;
}
device_initcall(tst_i2c_board_setup);

关于如何解决这个问题有什么建议吗?


由于您拥有支持 ACPI 的平台,因此最好的方法是提供给定设备的 ASL 摘录。

由于适用于 IoT 的 Intel Galileo 平台,Atmel 24 系列 EEPROM 拥有自己的 ACPI ID,摘录很简单:

DefinitionBlock ("at24.aml", "SSDT", 5, "", "AT24", 1)
{
    External (_SB_.PCI0.I2C2, DeviceObj)

    Scope (\_SB.PCI0.I2C2)
    {
        Device (EEP0) {
            Name (_HID, "INT3499")
            Name (_DDN, "Atmel AT24 compatible EEPROM")
            Name (_CRS, ResourceTemplate () {
                I2cSerialBusV2 (
                    0x0057,              // I2C Slave Address
                    ControllerInitiated,
                    400000,              // Bus speed
                    AddressingMode7Bit,
                    "\\_SB.PCI0.I2C2",   // Link to ACPI I2C host controller
                    0
                )
            })

            Name (_DSD, Package () {
                ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
                Package () {
                    Package () {"size", 1024},
                    Package () {"pagesize", 32},
                }
            })
        }
    }
}

Note, the size property is being added in a pending patch series (patches add eeprom "size" property and add support to fetch eeprom device property "size").

请注意,目前硬编码的地址宽度为 8 位。如果您需要 16 位,则需要创建与上面提到的类似的补丁。

对于 LTC2990 功率监视器,您需要以下摘录:

DefinitionBlock ("ltc2990.aml", "SSDT", 5, "", "PMON", 1)
{
    External (\_SB_.PCI0.I2C2, DeviceObj)

    Scope (\_SB.PCI0.I2C2)
    {
        Device (PMON)
        {
            Name (_HID, "PRP0001")
            Name (_DDN, "Linear Technology LTC2990 power monitor")
            Name (_CRS, ResourceTemplate () {
                I2cSerialBus (
                    0x4c,                   // Bus address
                    ControllerInitiated,    // Don't care
                    400000,                 // Fast mode (400 kHz)
                    AddressingMode7Bit,     // 7-bit addressing
                    "\\_SB.PCI0.I2C2",      // I2C host controller
                    0                       // Must be 0
                )
            })

            Name (_DSD, Package () {
                ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
                Package () {
                    Package () {"compatible", "lltc,ltc2990"},
                }
            })
        }
    }
}

请注意,不幸的是驱动程序中没有兼容的字符串,因此,需要添加它,例如在这里完成.

在上面的例子中\\_SB.PCI0.I2C2是 I2C 主控制器的绝对路径。

如何应用这些文件:

  • 首先,创建一个文件夹
mkdir -p kernel/firmware/acpi
  • 将文件保存在中提到的名称下DefinitionBlock()该文件夹中的宏
  • 创建未压缩的 cpio 存档并将原始 initrd 连接到顶部:
find kernel | cpio -H newc --create > /boot/instrumented_initrd
cat /boot/initrd >> /boot/instrumented_initrd

更多详细信息请参阅SSDT 叠加.

其他示例和背后想法的描述可以在meta-acpi GitHub 页面,这里复制了一些材料。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 x86_64 上添加 i2c 客户端设备 的相关文章

  • 我的属性太活泼了,我该怎么办?

    在 Linux 设备驱动程序中 创建 sysfs 属性probe太活泼了 具体来说 它经历了与用户空间的竞争条件 http kroah com log blog 2013 06 26 how to create a sysfs file c
  • 为什么 GCC 在堆栈上压入额外的返回地址?

    我目前正在学习汇编的基础知识 在查看 GCC 6 1 1 生成的指令时遇到了一些奇怪的情况 这是来源 include
  • 32位进程在64位操作系统上可以访问多少内存?

    在 Windows 上 正常情况下 32 位进程只能访问 2GB RAM 或通过 boot ini 文件中的特殊开关访问 3GB 在 64 位操作系统上运行 32 位进程时 有多少可用内存 是否有任何特殊的开关或设置可以改变这种情况 默认
  • x86:寄存器操作为内存内容和内存地址?

    寄存器 gt 内存地址 gt 内存内容 内存地址 gt 内存内容 上面的模型正确吗 而且 如果是的话 你能建议我是否认为正确吗 movl eax ebx gt 它将 eax 的内存地址移动到 ebx 这也会导致内容移动 movl eax e
  • 如何阅读英特尔操作码符号

    我正在阅读一些引用的材料Intel vol 2 SDM x86 手册 https www intel com content www us en developer articles technical intel sdm html关于汇编
  • 民意调查立即从驱动程序中退出

    这是我第一次在 Linux 内核中实现驱动程序并面临这个问题 我正在尝试在我的字符驱动程序中实现 poll 我已调用 poll wait 并传递了一个等待队列 当从用户空间程序打开该驱动程序的设备文件并在此设备文件描述符 fd 上调用 po
  • 对齐与未对齐 x86 SIMD 指令之间的选择

    SIMD指令一般有两种类型 A 使用对齐的内存地址 如果地址未在操作数大小边界上对齐 则会引发一般保护 GP 异常 movaps xmm0 xmmword ptr rax vmovaps ymm0 ymmword ptr rax vmova
  • C 标准库函数与系统调用。哪个是“open()”?

    I know fopen 在C标准库中 所以我绝对可以调用fopen C 程序中的函数 我感到困惑的是为什么我可以打电话给open 功能也一样 open 应该是系统调用 所以它不是标准库中的C函数 因为我能够成功地调用open 函数 我调用
  • GDB 脚本编写为 MOCK

    我正在尝试使用 GDB 模拟一个函数 用于单元测试父函数 一种方法是在您想要模拟和使用 GDB 的函数中设置一个断点return命令 但是当 GDB 时我无法做同样的事情call使用命令 gdb b secret check Breakpo
  • 为什么 NASM 在使用有效的指令助记符作为操作数中的符号名称方面没有问题?

    我编写了以下简单程序 但 nasm 拒绝编译它 section text global start start mov rax 0x01 mov rdi 0x01 mov rsi str mov rdx 0x03 syscall mov r
  • 编写I2C设备驱动时探测问题

    我是编写Linux设备驱动程序的新手 如果有什么愚蠢的问题和我糟糕的英语请原谅我 我正在尝试为触摸屏编写一个驱动程序 它通过 I2C 与 CPU 通信 我尝试在linux平台上添加设备驱动程序 注册成功 我的意思是驱动程序已加载 但探测功能
  • 让 GCC/Clang 使用 CMOV

    我有一个简单的标记值联合 这些值可以是int64 ts or doubles 我正在对这些联合进行加法 但需要注意的是 如果两个参数都代表int64 t值 那么结果也应该有一个int64 t value 这是代码 include
  • 使用`esp*scale 时寻址内存时出错

    内存寻址一般形式 发现了here https stuff mit edu afs athena project rhel doc OldFiles 3 rhel as en 3 i386 memory html is base index
  • 如何通过jiffies实现经过时间

    我想了解如何在 C 中使用 jiffies 实现经过时间 假设我有一系列指令 include
  • 汇编:使用数据段寄存器(DS)

    目前我正在学习 x86 汇编 因为我喜欢微控制器编程 所以我熟悉汇编 目前我一直在到处寻找这个问题的答案 但似乎找不到它 DS寄存器 我知道它应该指向我程序中的全局数据 但我不知道知道它到底是如何工作的 我正在使用 NASM 在大多数简单的
  • MS-DOS - 是否可以对 24 位图形进行编程?

    是否可以在 DOS 机器上以 24 位颜色深度进行编程 我知道 VGA 支持 8 位色深 但是有没有办法弄出 24 位色深 谷歌的研究没有发现任何结果 我正在 FreeDOS 而不是 MS DOS 上编程 如果这会影响答案的话 对的 这是可
  • 是否可以调用驻留在 exe 中的非导出函数?

    我想调用驻留在第 3 方 exe 中的函数并获取其结果 好像有should是一种方法 只要我知道函数地址 调用约定等 但我不知道如何 有谁知道我会怎么做 我意识到任何解决方案都是非标准的黑客 但有must成为一种方式 我的非恶意用例 我正在
  • 二元炸弹 - 第 6 阶段

    这是拆解phase 6 08048dbf
  • Haswell 及其后续产品上的 A20 系列是否仍会被屏蔽?

    维基百科引用了英特尔手册中的这一说法 A20M 的功能主要由较旧的操作系统使用 现代操作系统不使用 在较新的 Intel 64 处理器上 A20M 可能不存在 现在的手册中实际上有这样一个短语 但它是含糊不清的 Does A20M 实际上仅
  • 我们可以使用 x86_64 CPU 原子在 PCI Express 上生成复合原子操作吗?

    如您所知 从2 0版本开始 PCI Express支持复合原子操作 FetchAdd Swap CAS https pcisig com sites default files specification documents ECN Ato

随机推荐