zanglengyu 发表于 2021-7-8 11:54:05

\linux-3.0.35 内核编译驱动问题

我们需要在开发板子上,安装一个串口扩展模块

这个串口扩展模块的硬件提供厂商,给了一个驱动文件

目前通过各种百度搜索,得知,需要先在飞凌的嵌入式系统内核中,安装这个驱动文件才能识别具体的扩展串口

安装前就需要在飞凌这个内核下,编译出这个驱动文件

想知道具体的编译流程是什么?


我目前百度已知的流程:
编译linux-3.0.35
配置驱动文件的makefile 文件

make就行了,具体的make文件如下。目前我的内核编译环境貌似有问题,将内核源码放在KERNEL_SRC 下。执行make,会报找不到target的错误。
如果直接运行,这个linux-3.0.35下的build.sh脚本也会报错。

#makefile for XR17v35x PCIe UARTs for Linux 2.6.32 and newer
KERNEL_SRC = /media/sf_TestQtGui/ar_install/3.0.35kernal/build

CROSS_COMPILE:= arm-fsl-linux-gnueabi-
ARCH:= arm
CC:= $(CROSS_COMPILE)gcc
LD:= $(CROSS_COMPILE)ld


all: build

obj-m += xr17v35x.o

xrpci-objs :=        xr17v35x.o

EXTRA_CFLAGS +=-DDEBUG=1

build:
        $(MAKE) -C $(KERNEL_SRC) SUBDIRS=$(PWD) modules

install:
        cp xr17v35x.ko /lib/modules/$(shell uname -r)/kernel/drivers/char
clean:
        rm -f *~ *.o
        rm -f *~ *.ko





问题1: 上述方法是否可行?
问题2: 如果不可行,是都有其他方法编译出 在飞凌系统下可用的 xr17v35x.c 的驱动文件

问题3:我看论坛其他帖子上有说,可将这个.c放在内核源码的drivers\misc 下 重新编译内核刷机就行。具体哪个可以?谢谢1



zanglengyu 发表于 2021-7-9 16:47:25

编译内核源码 报错
ilter/xt_mark.o
net/netfilter/xt_mark.c: In function 'mark_tg':
net/netfilter/xt_mark.c:32:32: error: dereferencing pointer to incomplete type
net/netfilter/xt_mark.c:32:46: error: dereferencing pointer to incomplete type
net/netfilter/xt_mark.c: In function 'mark_mt':
net/netfilter/xt_mark.c:41:27: error: dereferencing pointer to incomplete type
net/netfilter/xt_mark.c:41:42: error: dereferencing pointer to incomplete type
net/netfilter/xt_mark.c:41:56: error: dereferencing pointer to incomplete type
net/netfilter/xt_mark.c: At top level:
net/netfilter/xt_mark.c:49:27: error: invalid application of 'sizeof' to incomplete type 'struct xt_mark_tginfo2'
net/netfilter/xt_mark.c:58:27: error: invalid application of 'sizeof' to incomplete type 'struct xt_mark_mtinfo1'
make: *** Error 1
make: *** Error 2
make: *** Error 2

zanglengyu 发表于 2021-7-9 16:48:34

问题3:我看论坛其他帖子上有说,可将这个.c放在内核源码的drivers\misc 下 重新编译内核刷机就行。具体哪个可以?谢谢1

我将这个.c放到这个目录下,修改makefile 编译出了ko,但是在开发板上insmod时候,提示格式错误。编译环境没问题啊。按照文档来编译的,执行make modules之后,就可以生成。

zanglengyu 发表于 2021-7-9 16:51:11

insmod: can't insert 'mxs-perfmon.ko': invalid module format,而且我insmod其他编译出来的ko文件,也是报错的。官方看到解答下吧

zanglengyu 发表于 2021-7-9 17:28:33


开发板上的linux内核是
3.0.35-2666-gbdde708-00002-g108f810

编译的linux源码内核是linux-3.0.35,
交叉编译工具
cmd_drivers/misc/xr17v35x.ko := /opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-ld -EL -r-T /media/sf_TestQtGui/ar_install/linux-3.0.35/scripts/module-common.lds --build-id-o drivers/misc/xr17v35x.ko drivers/misc/xr17v35x.o drivers/misc/xr17v35x.mod.o



这个是文件信息 看起来没什么问题,
./drivers/misc/xr17v35x.ko: ELF 32-bit LSB relocatable, ARM, version 1 (SYSV), BuildID=0x36c6cd68eb7ff3a931d4747df008cb475728a53e, not stripped

zanglengyu 发表于 2021-7-9 17:36:16

https://blog.csdn.net/weixin_39127054/article/details/82689084,这篇帖子感觉可以解决这个问题。。。

wjy 发表于 2021-7-12 10:36:20

您用的是我们提供的3.0.35的开发环境吗?我们提供的环境是搭建好交叉编译链的。
您试试把您需要移植的驱动放到drivers目录下,检查下Makefile和Kconfig文件,编辑drivers顶层的Kconfig,Makefile文件,把新加入的驱动加进去。然后按照我们的软件手册里的编译章节进行编译,在make menuconfig中配置您自己的的驱动。
或者您可以先在配置文件里都配置成m,然后用make modules编译看能否生成.ko文件,然后单独把.ko文件拷进开发板中,chmod 777 **.ko给权限,然后insmod挂载。

zanglengyu 发表于 2021-7-12 11:39:55

wjy 发表于 2021-7-12 10:36
您用的是我们提供的3.0.35的开发环境吗?我们提供的环境是搭建好交叉编译链的。
您试试把您需要移植的驱动 ...

是3.0.35环境,我可以编出来,就是总是提示格式不正确。我百度查了,是说那个menuconfig 可能与板子中的不一致。

我现在将板子中烧录的那个镜像的配置文件/proc/config.gz 搞出来了,按照那个配置内核module那块的配置重新配置,保证一样了。

但是目前编译出来你们自带内核文件,还是会提示ko格式不正确。

我用了你们/drivers/misc 这个目录下的那个mxs-perfmon.ko文件

我再试试你说的那个办法。

目前问题就是在开发板上提示文件格式不正确,我检查了操作系统内核版本和配置的差异,应该没问题的啊。

除了这两个还有别的会导致编出来的内核 报错吗insmod: can't insert 'mxs-perfmon.ko': invalid module format

zanglengyu 发表于 2021-7-12 12:56:03

本帖最后由 zanglengyu 于 2021-7-12 12:59 编辑

我特地将板子中已经存在的驱动文件复制出来,同modinfo 命令查看信息

其中板子中显示的信息如下:
root@ubuntu:/media/sf_TestQtGui/ar_install# modinfo mxs-perfmon.ko
filename:       mxs-perfmon.ko
license:      GPL
description:    Performance Monitor user-access driver
author:         Freescale Semiconductor, Inc.
depends:      
vermagic:       3.0.35-2666-gbdde708-00002-g108f810 SMP preempt mod_unload modversions ARMv7

我自己编译出来的驱动信息如下:
root@ubuntu:/media/sf_TestQtGui/ar_install/linux-3.0.35/drivers/misc# modinfo mxs-perfmon.ko
filename:       mxs-perfmon.ko
license:      GPL
description:    Performance Monitor user-access driver
author:         Freescale Semiconductor, Inc.
depends:      
vermagic:       3.0.35-2666-gbdde708 SMP preempt mod_unload modversions ARMv7

可以看到,他们内核版本有个细微的差别。

因为我编译内核源码失败,是直接执行的make modules 命令。

板子上的烧录的镜像文件是2019年

OKMX6Q-C、OKMX6DL-C (Linux)用户资料-2019.08.30 这个目录下的linux源码

因为我们拿到的这个下面的源码是存在删减的,里边没有源码,所以我去官方下载了这个板子最新的一套资料。
最新的是:OKMX6Q-C、OKMX6DL-C (Linux)用户资料-2019.12.30 用来编译驱动。

目前这个问题配置也检查过了,内核信息也对过了,驱动文件还是会报错。提示格式不对,这两个细微的版本差别会导致这个问题吗?

还有我是直接调用的 make modules,没有编译内核,因为编译内核是报错的。。

wjy 发表于 2021-7-12 16:21:37

zanglengyu 发表于 2021-7-12 12:56
我特地将板子中已经存在的驱动文件复制出来,同modinfo 命令查看信息

其中板子中显示的信息如下:


您按照我们手册里的方法看看开发环境里的交叉编译工具配置得有问题吗,有可能是因为您的内核编译不过导致的,直接编译驱动编译出来的在原厂内核上用不了。
您的驱动是现成的吗?可以发过来我们这边帮您试一下。

wjy 发表于 2021-7-13 14:36:27

您这个不带Kconfig和Makefile吗

zanglengyu 发表于 2021-7-13 14:39:28

本帖最后由 zanglengyu 于 2021-7-13 14:41 编辑

wjy 发表于 2021-7-13 14:36
您这个不带Kconfig和Makefile吗
可以修改 makefile
obj-$(CONFIG_XR17V35_PORT)      += xr17v35x.o

KConfig
config XR17V35_PORT
      tristate "XR17V35"
      default m
      
我用dmesg看了一下, 有这个错误:

xr17v35x: no symbol version for module_layout
xr17v35x: no symbol version for module_layout
xr17v35x: no symbol version for module_layout
mxs_perfmon: no symbol version for module_layout


看来可能还是因为没有编译内核,直接make modules 导致的。这样出来的ko文件信息有问题
,看来要解决内核编译失败那个问题了

zanglengyu 发表于 2021-7-13 14:45:50

wjy 发表于 2021-7-13 14:36
您这个不带Kconfig和Makefile吗


这个驱动模块只有一个makefile
Kconfig 不需要的

KERNEL_SRC = /lib/modules/`uname -r`/build

all: build

obj-m += xr17v35x.o

xrpci-objs :=        xr17v35x.o

EXTRA_CFLAGS +=-DDEBUG=1

build:
        $(MAKE) -C $(KERNEL_SRC) SUBDIRS=$(PWD) modules

install:
        cp xr17v35x.ko /lib/modules/$(shell uname -r)/kernel/drivers/char
clean:
        rm -f *~ *.o
        rm -f *~ *.ko

zanglengyu 发表于 2021-7-13 15:49:15

我配置内核,把网络模块去掉了,又报这个错。。。

LD      init/built-in.o
make: warning:Clock skew detected.Your build may be incomplete.
LD      .tmp_vmlinux1
arch/arm/mach-mx6/built-in.o: In function `mx6_arm2_fec_phy_init':
usb_h1.c:(.text+0xfedc): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0xfef0): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0xff04): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0xff14): undefined reference to `mdiobus_read'
usb_h1.c:(.text+0xff2c): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0xff40): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0xff54): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0xff68): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0xff78): undefined reference to `mdiobus_read'
usb_h1.c:(.text+0xff94): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0xffa8): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0xffb8): undefined reference to `mdiobus_read'
usb_h1.c:(.text+0xffd0): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0xffe0): undefined reference to `mdiobus_read'
usb_h1.c:(.text+0x10004): undefined reference to `mdiobus_write'
arch/arm/mach-mx6/built-in.o: In function `mx6_arm2_fec_power_hibernate':
usb_h1.c:(.text+0x10028): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x10038): undefined reference to `mdiobus_read'
usb_h1.c:(.text+0x10054): undefined reference to `mdiobus_write'
arch/arm/mach-mx6/built-in.o: In function `mx6q_sabrelite_fec_phy_init':
usb_h1.c:(.text+0x1074c): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x10760): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x10774): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x10788): undefined reference to `mdiobus_write'
arch/arm/mach-mx6/built-in.o:usb_h1.c:(.text+0x1079c): more undefined references to `mdiobus_write' follow
arch/arm/mach-mx6/built-in.o: In function `mx6q_sabresd_fec_phy_init':
usb_h1.c:(.text+0x114f4): undefined reference to `mdiobus_read'
usb_h1.c:(.text+0x1150c): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x11520): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x11534): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x11548): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x11558): undefined reference to `mdiobus_read'
usb_h1.c:(.text+0x11574): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x11588): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x11598): undefined reference to `mdiobus_read'
usb_h1.c:(.text+0x115b0): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x115c0): undefined reference to `mdiobus_read'
usb_h1.c:(.text+0x115e4): undefined reference to `mdiobus_write'
arch/arm/mach-mx6/built-in.o: In function `mx6q_sabreauto_fec_phy_init':
usb_h1.c:(.text+0x11f50): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x11f64): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x11f78): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x11f88): undefined reference to `mdiobus_read'
usb_h1.c:(.text+0x11fa0): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x11fb4): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x11fc8): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x11fdc): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x11fec): undefined reference to `mdiobus_read'
usb_h1.c:(.text+0x12008): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x1201c): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x1202c): undefined reference to `mdiobus_read'
usb_h1.c:(.text+0x12044): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x12054): undefined reference to `mdiobus_read'
usb_h1.c:(.text+0x12078): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x1208c): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x120a0): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x120b4): undefined reference to `mdiobus_write'
usb_h1.c:(.text+0x120c8): undefined reference to `mdiobus_write'
arch/arm/mach-mx6/built-in.o:usb_h1.c:(.text+0x120dc): more undefined references to `mdiobus_write' follow
make: *** [.tmp_vmlinux1] Error 1

zanglengyu 发表于 2021-7-14 10:06:02

这个驱动在内核编译成功之后,可以编译使用了,结贴,不过又出现了新的问题
页: [1]
查看完整版本: \linux-3.0.35 内核编译驱动问题