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
相关推荐
cooldream20092 小时前
Windows11中 WSL2全方位安装与实战指南
linux·部署·wsl
文静小土豆2 小时前
标签和选择器(Label和 Selector)
linux·前端
攻城狮在此2 小时前
MobaXterm下载安装及SSH远程连接(交换机/路由器/服务器)
linux·运维·服务器·网络
花间相见2 小时前
【Agent开发】—— ToolCall 、 FunctionCall 底层原理与极简实现
运维·服务器
mounter6253 小时前
【LSF/MM内核前沿】Linux 内存回收推倒重来?解析 MGLRU 与传统 LRU 的“统一之战”
linux·运维·服务器·网络·内核·内存回收
我不是懒洋洋3 小时前
【数据结构】顺序表专题(详细代码及配图)
c语言·开发语言·数据结构·算法·青少年编程·visual studio
Exquisite.3 小时前
k8s的Pod管理
linux·运维·服务器
IMPYLH3 小时前
Linux 的 env 命令
linux·运维·服务器·数据库
抠脚学代码3 小时前
Linux开发--> UBoot学习
linux·学习·uboot