LFS系统Elan触控板故障:加载i2c_designware_core模块遇符号重复错误
我之前在LFS环境折腾硬件驱动时也碰到过类似的模块符号冲突问题,结合你的排查信息,给你几个针对性的解决思路:
1. 先排查内核编译的配置冲突
你遇到的exports duplicate symbol错误,90%的概率是**内核已经把i2c_designware_core相关代码编译成内置组件(built-in)**了,而你现在又尝试加载同名的可加载模块,导致符号重复。
你可以去内核源码目录检查配置文件:
grep -i "i2c_designware" /usr/src/linux/.config
如果输出里有CONFIG_I2C_DESIGNWARE_CORE=y(注意是y不是m),就说明这个模块已经被编译进内核了,自然不能再加载外部模块。这种情况下需要修改配置:
cd /usr/src/linux make menuconfig # 找到I2C -> Designware I2C core support,把它改成模块模式(M) make && make modules_install cp arch/x86/boot/bzImage /boot/vmlinuz-lfs-你的内核版本号
重启后再尝试加载模块,应该就不会有冲突了。
2. 确认内核中是否已存在目标符号
即使rmmod显示模块未加载,也可能有其他依赖模块(比如i2c_designware_platform或i2c_designware_pci)被内置进内核,它们同样会导出i2c_dw_probe符号。你可以用这个命令验证:
cat /proc/kallsyms | grep i2c_dw_probe
如果能找到这个符号的输出,说明内核里已经有代码实现了它,这时候完全不需要再手动加载i2c_designware_core模块。
3. 验证Elan触控板的I2C设备是否被识别
假设内核已经正确内置/加载了i2c_designware组件,接下来要确认触控板本身是否被检测到:
- 先查看系统中的I2C总线:
i2cdetect -l
- 找到对应的总线后,扫描总线上的设备(比如总线编号是0):
i2cdetect -y 0
Elan触控板一般会显示15或2c这类地址,如果能看到,说明硬件连接没问题。
- 最后加载触控板专属模块:
modprobe elan_i2c
然后检查输入设备是否被识别:
cat /proc/bus/input/devices | grep -A 5 -B 5 Elan
如果能看到对应的input设备,就可以用xinput(需要先安装Xorg工具链)来配置触控板的手势、灵敏度等参数了。
4. 调整LFS的模块加载顺序
LFS默认的模块加载规则可能没有处理好i2c模块的依赖关系,你可以创建一个自定义配置文件来强制依赖加载:
在/etc/modprobe.d/下新建elan.conf,写入:
install elan_i2c /sbin/modprobe i2c_designware_core; /sbin/modprobe --ignore-install elan_i2c # 可选:添加ignore_lid参数解决合盖后触控板失效的问题 options elan_i2c ignore_lid=1
这个配置会在加载elan_i2c时自动先加载i2c_designware_core,避免依赖缺失。
内容的提问来源于stack exchange,提问作者TheVaffel

