01_basicLinux内核模块-CSDN博客文章浏览阅读304次,点赞3次,收藏3次。环境ID=ubuntuMakefilemodules:clean:basic.creturn 0;运行效果。https://blog.csdn.net/m0_37132481/article/details/136157384i2c_controller.c
root@T:/media/sf_D_DRIVE/kmodule/05_i2c_controller# cat i2c_controller.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/i2c.h>
#define TAG "HELLO# "
static s32 i2c_controller_xfer(struct i2c_adapter *adap, u16 addr, unsigned short flags,
char read_write, u8 command, int size, union i2c_smbus_data *data)
{
printk(TAG "%s called\n", __func__);
static int q;
if(read_write)
{
data->byte = q++;
}
return 0;
}
static u32 i2c_controller_func(struct i2c_adapter *adapter)
{
printk(TAG "%s called\n", __func__);
return I2C_FUNC_I2C | I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_READ_BYTE_DATA;
}
static const struct i2c_algorithm i2c_controller_algorithm = {
.functionality = i2c_controller_func,
.smbus_xfer = i2c_controller_xfer,
};
static struct i2c_adapter stub_adapter = {
.owner = THIS_MODULE,
.algo = &i2c_controller_algorithm,
.name = "my i2c_controller driver",
.nr = 10086,
};
static int __init i2c_controller_init(void)
{
printk(TAG "%s called\n", __func__);
i2c_add_numbered_adapter(&stub_adapter);
return 0;
}
static void __exit i2c_controller_exit(void)
{
printk(TAG "%s called\n", __func__);
i2c_del_adapter(&stub_adapter);
}
MODULE_LICENSE("GPL");
module_init(i2c_controller_init);
module_exit(i2c_controller_exit);
效果
make -C /usr/lib/modules/`uname -r`/build M=/media/sf_D_DRIVE/kmodule/05_i2c_controller modules
make[1]: Entering directory '/usr/src/linux-headers-6.5.0-17-generic'
warning: the compiler differs from the one used to build the kernel
The kernel was built by: x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
You are using: gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
CC [M] /media/sf_D_DRIVE/kmodule/05_i2c_controller/i2c_controller.o
MODPOST /media/sf_D_DRIVE/kmodule/05_i2c_controller/Module.symvers
CC [M] /media/sf_D_DRIVE/kmodule/05_i2c_controller/i2c_controller.mod.o
LD [M] /media/sf_D_DRIVE/kmodule/05_i2c_controller/i2c_controller.ko
BTF [M] /media/sf_D_DRIVE/kmodule/05_i2c_controller/i2c_controller.ko
Skipping BTF generation for /media/sf_D_DRIVE/kmodule/05_i2c_controller/i2c_controller.ko due to unavailability of vmlinux
make[1]: Leaving directory '/usr/src/linux-headers-6.5.0-17-generic'
root@T:/media/sf_D_DRIVE/kmodule/05_i2c_controller#
root@T:/media/sf_D_DRIVE/kmodule/05_i2c_controller#
root@T:/media/sf_D_DRIVE/kmodule/05_i2c_controller#
root@T:/media/sf_D_DRIVE/kmodule/05_i2c_controller#
root@T:/media/sf_D_DRIVE/kmodule/05_i2c_controller# insmod i2c_controller.ko
root@T:/media/sf_D_DRIVE/kmodule/05_i2c_controller#
root@T:/media/sf_D_DRIVE/kmodule/05_i2c_controller#
root@T:/media/sf_D_DRIVE/kmodule/05_i2c_controller#
root@T:/media/sf_D_DRIVE/kmodule/05_i2c_controller#
root@T:/media/sf_D_DRIVE/kmodule/05_i2c_controller#
root@T:/media/sf_D_DRIVE/kmodule/05_i2c_controller#
root@T:/media/sf_D_DRIVE/kmodule/05_i2c_controller#
root@T:/media/sf_D_DRIVE/kmodule/05_i2c_controller# i2cdetect -l
i2c-0 smbus SMBus PIIX4 adapter at 4100 SMBus adapter
i2c-10086 i2c my i2c_controller driver I2C adapter
root@T:/media/sf_D_DRIVE/kmodule/05_i2c_controller#
root@T:/media/sf_D_DRIVE/kmodule/05_i2c_controller#
root@T:/media/sf_D_DRIVE/kmodule/05_i2c_controller# i2cdump -y 10086 0x34
No size specified (using byte-data access)
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f .???????????????
10: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f ????????????????
20: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f !"#$%&'()*+,-./
30: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 0123456789:;<=>?
40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f @ABCDEFGHIJKLMNO
50: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f PQRSTUVWXYZ[\]^_
60: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f `abcdefghijklmno
70: 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f pqrstuvwxyz{|}~?
80: 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f ????????????????
90: 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f ????????????????
a0: a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af ????????????????
b0: b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf ????????????????
c0: c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf ????????????????
d0: d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df ????????????????
e0: e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef ????????????????
f0: f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff ???????????????.
root@T:/media/sf_D_DRIVE/kmodule/05_i2c_controller#