该过程只是一些步骤记录顺序并不完全一致,步骤仅供参考
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