gpt4 book ai didi

linux - i2c 驱动程序启动 - raspbian

转载 作者:行者123 更新时间:2023-12-02 09:37:28 34 4
gpt4 key购买 nike

我对 linux 上的设备驱动程序比较陌生。
我想要实现的是,在我的 Raspberry 启动时,外部 RGB 驱动程序将接收 i2c 命令,因此您可以在启动时看到 LED 亮起。

我的方法是尝试通过将在启动时加载的内核模块来实现这一点。
我尝试了很多东西来实现这一点,但目前我觉得我有知识差距。也许有人可以帮助我? (请注意,这不是硬件问题,我可以从用户空间向设备发送命令。)

我的内核模块代码如下:

    #include <linux/i2c.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/hwmon.h>
#include <linux/hwmon-sysfs.h>
#include <linux/regmap.h>


MODULE_AUTHOR ("Niels");
MODULE_DESCRIPTION("driver rgb led");
MODULE_LICENSE("GPL");

/*CAT3626 control registers*/
#define CAT3626_ADDRESS 0x66
#define CAT3626_ENA 0x03
#define CAT3626_REGA 0x00
#define CAT3626_REGB 0x01
#define CAT3626_REGC 0x02

struct cat3626 {
struct device *dev;
struct regmap * regmap;
};


enum {
cat3626,
};

static const struct of_device_id cat3626_dt_ids[] = {
{ .compatible = "onsemi,cat3626", .data = (void *)cat3626},
{ }
};

MODULE_DEVICE_TABLE(of, cat3626_dt_ids);


static const struct i2c_device_id cat3626_id[] = {
{"cat3626",cat3626},
{ }
};

MODULE_DEVICE_TABLE(i2c, cat3626_id);

static const struct regmap_config regmap_config = {
.reg_bits = 8,
.val_bits = 8,
};

static int cat3626_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
struct cat3626 *cat3626;
const struct of_device_id *match;
int ret;

cat3626 = devm_kzalloc(&client->dev, sizeof(struct cat3626), GFP_KERNEL);
if (!cat3626){
return -ENOMEM;
}

dev_set_drvdata(&client->dev, cat3626);
cat3626->dev = &client->dev;

cat3626->regmap = devm_regmap_init_i2c(client, &regmap_config);
if (IS_ERR(cat3626->regmap)) {
dev_err(cat3626->dev, "regmap allocation failed\n");
return PTR_ERR(cat3626->regmap);
}

i2c_set_clientdata(client, cat3626);

match = of_match_device(cat3626_dt_ids, &client->dev);
if (!match) {
dev_err(&client->dev, "unknown device model\n");
return -ENODEV;
}

ret = i2c_smbus_write_byte_data(client, CAT3626_ENA, 0x30); /* write LED C on*/
ret = i2c_smbus_write_byte_data(client, CAT3626_REGC, 19); /* write mA*/

return ret;
}

static struct i2c_driver cat3626_driver = {
.driver = {
.name = "cat3626",
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(cat3626_dt_ids),
},
.probe = cat3626_probe,
.remove = cat3626_remove,
.id_table = cat3626_id,
};

module_i2c_driver(cat3626_driver);

这是生成文件:
ifneq ($(KERNELRELEASE),)
obj-m := hiber_rgb_driver.o

else
KERNELDIR ?= \
/lib/modules/`uname -r`/build/
PWD := `pwd`

default:
$(MAKE) -C $(KERNELDIR) \
M=$(PWD) modules

endif

clean:
rm -f *.ko *.o Module* *mod*

在/boot/config.txt 文件中我添加了这个:
dtoverlay = i2c-gpio, bus = 80, i2c_gpio_delay_us = 2, i2c_gpio_sda = 44, i2c_gpio_scl = 45.

另外我做了一个自定义的dtoverlay:
/dts-v1/;
/plugin/;

/ {
fragment@0 {
target = <&i2c80>;
__overlay__ {
status = "okay";
#address-cells = <1>;
#size-cells = <0>;

cat3626: cat3626@66 {
compatible = "onsemi,cat3626";
reg = <0x66>;
clock-frequency = <400000>;
};
};
};
};

不幸的是,启动时没有任何 react 。
我从启动 dmesg 得到的所有信息如下:
rgb_driver: loading out-of-tree module taints kernel

任何人都可以给我任何帮助,或者用不同的方法来实现我的目标?

提前致谢!

最佳答案

有几件事需要注意 - 受污染的内核通常会减少功能,如果您不必这样做,您可能不想去那里。我会尝试解决污染问题。我已经将内核模块构建为独立的,并且没有遇到污染问题。您可能希望重新访问您的makefile,这是一个更标准的模块构建makefile,有一些皱纹,当然,您正在交叉编译 -

PWD = $(shell pwd)
obj-m += hiber_rgb_driver.o

all:
make ARCH=arm CROSS_COMPILE=$(CROSS) -C $(KERNEL) SUBDIRS=$(PWD) modules

clean:
make -C $(KERNEL) SUBDIRS=$(PWD) clean

并用类似的东西构建它 -
make KERNEL=<LINUX_SOURCE_DIR> CROSS=<TOOLCHAIN_DIR>/bin/arm-linux-gnueabihf-

所以就是这样。

接下来,您的设备探测内容看起来很有趣。我没有时间为您调试它,但我建议在其中添加一些 printk 以验证探针是否被命中。如果是,那就太好了,这只是弄清楚为什么你不“匹配”的问题。如果它没有被击中,请继续阅读..

您可能知道,在设备探测方面,i2c 总线有点特别。没有真正的自动或神奇的探测,通常会在 PCI 总线上发生。相反,您需要构建一个内核可以在引导时遍历的设备树,以完成所有探测。

我看到你已经创建了一个覆盖片段。您需要确保将该内容编译为内核可以解析的“.dtb”字节码二进制文件,然后将其放入引导媒体中 grub 可以找到它的正确位置。

您可能还需要更新设备的主 dtb 以引用此覆盖,以便内核知道它可能会去哪里。将设备的 dtb 视为人造圣诞树,将覆盖层视为可以在 future 某个时间连接的肢体 - 您需要在设备 dtb 中指定连接点。我希望我能在这里更准确,但希望至少在这一点上能让你朝着正确的方向前进。

关于linux - i2c 驱动程序启动 - raspbian,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60229992/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com