t113-c-驱动ko制作与运行篇

记录:

tina的include文件在:/home/momo/T113/Tina-Linux/lichee/linux-5.4/include

驱动文件:/home/momo/T113/Tina-Linux/lichee/linux-5.4/drivers

而设备树文件在:/home/momo/T113/Tina-Linux/lichee/linux-5.4/arch/arm/boot/dts

t113所用的设备树文件在:/home/momo/T113/Tina-Linux/device/config/chips/t113/configs/mq_r

模块的出入口

我们来寻找一个简单的文件查看模块的入口

在这个目录下的这个文件打开后可以看见相对少量的代码

MODULE_AUTHOR("samuel.thibault@ens-lyon.org");

此函数是用来描述驱动作者信息的

在最后一行我门可以看到这个模块的入口函数和出口函数以及模块描述和模块证件(必要)

以及在头部我们可以看到模块的头文件

当然我在学习过程中还看到了其他的模块入口函数,具体的解析:

https://blog.csdn.net/qq_37568748/article/details/109504432

https://blog.csdn.net/ASKLW/article/details/79698422

简单来说就是uboot启动的顺序不大相同

模块出入口解析(module.h)

可以看到module的初始化和退出都是调用了__initcall函数,其定义在linux/init.h我们不再追究,在网上可以了解到module_init的优先值大概是6

模块的制作

那么既然已经知道了模块的出入口,那么我们简单做个模块

代码编写

我们简单编写一个出入口函数,并且出入口的函数前面的int和void貌似是固定的,因为看了几个都是这样

同时加了license,这是必要的,其他的可以不加。另外printk是uboot特有的打印函数,和printf用法差不多,详细的printk用法

CMAKE、makefile配置

配置cmake的时候发现出现installed or the value of the "cmake.cmakePath" setting contains the correct path的错误但是cmake也在vscode安装了,排查后发现是需要在终端apt install一个cmake才能用

我在网上找了一个用cmake编写makefile来编译ko文件的代码

https://blog.csdn.net/rangfei/article/details/119352372

复制过来稍微改一下

其中CMAKE_CURRENT_BINARY_DIR表示当前build目录下(但实际确实当前目录下,并不是build)

然后发现cmake的根本用不了,于是只能用原子哥的makefile来make了

终于可以编译成ko文件,中途有个选择内核压缩格式的,我选了6

后面又发现,cmake可以用。。。代码如下

cmake_minimum_required(VERSION 3.10)
project(momodule)

# 由于我的系统更新过内核,所以这里需要设置内核源代码路径
set(KDIR /home/momo/T113/Tina-Linux/lichee/linux-5.4)

# 定义编译函数/方法,驱动编译过程主要在这个函数进行
function(compile_module obj)
  set(TARGET_NAME ${obj})
  # 添加目标,obj即为模块名称。由于我在build目录下构建,所以这里选择将.c和.h文件拷贝到该目录下
  add_custom_target(${TARGET_NAME} ALL 
  		    )

  # 设置依赖,相当于Makefile中的 $(MODULE_NAME)-objs += demo_main.o
  #set(depend_objlist "demo_main.o")
  
  # 设置编译命令
  add_custom_command(TARGET ${TARGET_NAME}
		     POST_BUILD
		     COMMAND echo "obj-m := ${obj}.o" > ${CMAKE_CURRENT_BINARY_DIR}/Makefile
		     #COMMAND echo "${obj}-objs:=${depend_objlist}" >>${CMAKE_CURRENT_BINARY_DIR}/Makefile
		     COMMAND make -C ${KDIR} M=${CMAKE_CURRENT_BINARY_DIR} modules
		     )
endfunction()

# 调用编译函数

compile_module(momodule)

上板测试

第一次失败

完全不知道什么错误,如果是内核不一什么的应该会有提示的,但是这个就一个简单的failed to insert,很烦

尝试用百问网的编译内核放进板子试一试,其中出现没用文件的错误

我在这里找到一些答案

尝试用sudo make V=1 all

还是失败了,于是我想是不是gcc的问题

第二次尝试(改gcc环境)

我找到了sdk的gcc工具链,但是有多种工具,类似arm9的v853的,由于t113和v853都是arm7所以我选择了此工具链

途中遇到环境变量的错误,我再这篇文章找到了答案

export STAGING_DIR=~/T113/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-glibc-gcc-531/toolchain/bin/arm-openwrt-linux-gnueabi-gcc.bin:$STAGING_DIR

运行make ARCH=arm CROSS_COMPILE=~/T113/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-glibc-gcc-531/toolchain/bin/arm-openwrt-linux-gnueabi-

再一次失败,未定义此宏。

试过了这俩个工具链

虽然成功编译了modules和ko文件

仍然是失败了

但是可执行文件是可以用的,说明工具链应该选的没用问题

posted @ 2023-07-02 15:37  悠闲的小莫  阅读(577)  评论(0编辑  收藏  举报