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文件
仍然是失败了
但是可执行文件是可以用的,说明工具链应该选的没用问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」