Linux编译eeprom

该过程只是一些步骤记录顺序并不完全一致,步骤仅供参考

bash 复制代码
# 1. 克隆仓库但不检出文件
git clone https://github.com/torvalds/linux.git --depth=1

cd linux

# 2. 启用稀疏检出功能
#git sparse-checkout init

# 3. 设置你要的文件夹路径(相对仓库根目录)
#git sparse-checkout set drivers/misc/eeprom arch scripts include init




uname -r                            # 记下当前内核版本,比如 6.8.0-31-generic
6.1.0-31-amd64
sudo apt-get install -y build-essential bc flex bison libssl-dev libelf-dev pkg-config libncurses-dev linux-source-6.1
sudo apt-get install -y linux-headers-$(uname -r)  
#或者头文件.  apt search linux-headers 
 sudo apt-get install -y linux-headers-6.1.0-32-amd64
# 可选:如果要用"同版本完整源码"
#sudo apt-get source linux-image-$(uname -r) || true



apt install linux-source-6.1
apt install -y linux-headers-6.1.0-31-amd64
cd /usr/src
tar xf linux-source-6.1.tar.xz
cd linux-source-6.1

# 用当前系统配置作为基线
cp -v /boot/config-$(uname -r) .config

# 命令会生成 Module.symvers 文件
make modules_prepare

# 让配置与源码同步
yes "" | make oldconfig
# 交互式把上面几个选项勾成 m(或直接用 menuconfig 搜索 "AT24/AT25/EE1004")
make menuconfig
make prepare
make modules_prepare
make -j$(nproc) M=drivers/misc/eeprom modules


ls   /usr/src/linux-source-6.1/drivers/misc/eeprom/eeprom_93cx6.ko


# 安装内核
find / -name eeprom_93cx6.ko

/usr/src/linux-source-6.1/drivers/misc/eeprom/eeprom_93cx6.ko
/usr/lib/modules/6.1.0-38-amd64/kernel/drivers/misc/eeprom/eeprom_93cx6.ko
/usr/lib/modules/6.1.0-31-amd64/kernel/drivers/misc/eeprom/eeprom_93cx6.ko

sudo insmod eeprom_93cx6.ko
sudo insmod  /usr/lib/modules/6.1.0-31-amd64/kernel/drivers/misc/eeprom/eeprom_93cx6.ko


#查看
lsmod | grep eeprom

# 查看设备节点
ls -l /dev/misc* /dev/eeprom*
可能的设备名:/dev/eeprom0、/dev/misc/eeprom 等

如果没有自动创建设备,需要手动用 mknod:

# 先查看驱动注册信息,获取 major 和 minor 号
sudo mknod /dev/eeprom0 c <major> <minor>

sudo mknod /dev/eeprom93cx6 c 10 239

major 和 minor 可以在 dmesg 中查看驱动注册信息,例如:


eeprom_93cx6: registered misc device eeprom93cx6



# 3. 测试驱动
# 查看驱动信息
ls -l /dev/eeprom93cx6

# 测试是否能打开
sudo cat /dev/eeprom93cx6 > /dev/null


# 查看总线号
 ls  /sys/bus/i2c/devices 
i2c-0

eeprom_test.c

c 复制代码
#include <linux/module.h>
#include <linux/init.h>
#include <linux/miscdevice.h>
#include <linux/kernel.h>
#include <linux/uaccess.h>
#include <linux/i2c.h>
#include <linux/delay.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Nimo");
MODULE_DESCRIPTION("EEPROM 93CX6 Test Module");

// 假设 EEPROM 通过 I2C 接口连接
#define EEPROM_I2C_ADDR 0x50  // 根据你的硬件调整
#define TEST_READ_LEN 8        // 读取前 8 个字节
#define I2C_BUS_NUM 0          // 总线号,根据硬件修改

static struct i2c_client *eeprom_client;

static void eeprom_test_read(void)
{
    struct i2c_adapter *adapter;
    u8 buf[TEST_READ_LEN];
    int i;

    adapter = i2c_get_adapter(I2C_BUS_NUM);
    if (!adapter) {
        pr_err("EEPROM: failed to get I2C adapter\n");
        return;
    }

    eeprom_client = i2c_new_dummy_device(adapter, EEPROM_I2C_ADDR);
    i2c_put_adapter(adapter);

    if (!eeprom_client) {
        pr_err("EEPROM: failed to create I2C client\n");
        return;
    }

    if (i2c_master_recv(eeprom_client, buf, TEST_READ_LEN) != TEST_READ_LEN) {
        pr_err("EEPROM: read failed\n");
        i2c_unregister_device(eeprom_client);
        return;
    }

    pr_info("EEPROM test read bytes: ");
    for (i = 0; i < TEST_READ_LEN; i++)
        pr_cont("%02x ", buf[i]);
    pr_cont("\n");

    i2c_unregister_device(eeprom_client);
}

static int __init eeprom_test_init(void)
{
    pr_info("EEPROM test module loaded\n");
    eeprom_test_read();
    return 0;
}

static void __exit eeprom_test_exit(void)
{
    pr_info("EEPROM test module unloaded\n");
}

module_init(eeprom_test_init);
module_exit(eeprom_test_exit);

Makefile

bash 复制代码
obj-m := eeprom_test.o
KDIR := /usr/src/linux-source-6.1
PWD := $(shell pwd)

all:
	$(MAKE) -C $(KDIR) M=$(PWD) modules

clean:
	$(MAKE) -C $(KDIR) M=$(PWD) clean

编译安装测试

bash 复制代码
# 编译安装
make
sudo insmod eeprom_test.ko

#测试读写 EEPROM(内核空间方式)
# 方法 A:用用户态工具访问(最简单)

# 读 256 字节
sudo dd if=/dev/eeprom93cx6 of=eeprom_dump.bin bs=1 count=256

# 写数据(谨慎)
sudo dd if=some_data.bin of=/dev/eeprom93cx6bs=1 count=256




# 方法 C:使用 I2C 工具(如果 EEPROM 接口是 I2C)

sudo apt install i2c-tools
i2cdetect -y 1       # 扫描总线
i2cget -y 1 0x50 0x00  # 读取 EEPROM 第 0 个字节
适用于硬件直接挂在 I2C 总线上的 93CX6 系列 EEPROM


MDIR="/usr/lib/modules/$(uname -r)"
KDIR="${MDIR}/build"

make -j$(nproc)  -C ${KDIR} M=drivers/misc/eeprom INSERT_CONFIG_FLAGS_OF_THE-MODULE_HERE=m modules
make -j$(nproc)  -C /usr/src/linux-headers-6.1.0-32-amd64 M=drivers/misc/eeprom INSERT_CONFIG_FLAGS_OF_THE-MODULE_HERE=m modules

# 只编译 drivers/misc/eeprom 下的模块
make oldconfig
make prepare
make modules_prepare

make -j$(nproc) M=drivers/misc/eeprom modules
相关推荐
Season4501 天前
C/C++的类型转换
c语言·开发语言·c++
learning-striving1 天前
centos9安装docker测试成功教程
linux·运维·服务器·docker·容器
feng_you_ying_li1 天前
linux之文件系统(3)
linux·运维·服务器
sbjdhjd1 天前
Docker 网络工业级实战手册
linux·运维·经验分享·笔记·docker·云原生·云计算
桌面运维家1 天前
服务器异常登录日志排查方法与安全防护实战
运维·服务器·安全
Flittly1 天前
【日常小问】解决 Jenkins 部署 Spring Cloud 微服务到 Docker 容器启动失败的问题
运维·笔记·docker·微服务·jenkins
AC赳赳老秦1 天前
故障自愈实战:用 OpenClaw 实现服务器日志自动化分析、根因定位、解决方案自动生成
大数据·运维·服务器·自动化·github·deepseek·openclaw
一只积极向上的小咸鱼1 天前
Linux 下 Claude Code 配置文件位置总结
linux·运维·服务器
小则又沐风a1 天前
Linux下的Git的上传(版本控制器)
linux·数据库·git
烛衔溟1 天前
TypeScript 接口实战 —— 处理复杂嵌套对象
linux·ubuntu·typescript