有人发过,但是sdk更新,现在已经用不了了->链接
重新发下教程:
新建个文件夹,在哪都行,内部放你的源文件和Makefile,
首先新建Makefile:输入以下内容
SDK_DIR = /home/kilo/Downloads/duo-buildroot-sdk
KERN_DIR = $(SDK_DIR)/linux_5.10
TEMP_PATH=/home/kilo/Downloads/duo-buildroot-sdk/host-tools/gcc/riscv64-linux-musl-x86_64/bin
TEMP_TOOL=${TEMP_PATH}/riscv64-unknown-linux-musl-
export CC=${TEMP_TOOL}gcc
export CXX=${TEMP_TOOL}g++
all:
make ARCH=riscv CROSS_COMPILE=$(TEMP_PATH)/riscv64-unknown-linux-musl- -C $(KERN_DIR) M=$(PWD) modules
clean:
make -C $(KERN_DIR) M=$(PWD) modules clean
rm -rf modules.order
prebuild:
cp $(SDK_DIR)/build/boards/cv180x/cv1800b_milkv_duo_sd/linux/cvitek_cv1800b_milkv_duo_sd_defconfig $(KERN_DIR)/arch/riscv/configs/cvitek_cv1800b_milkv_duo_sd_defconfig
make ARCH=riscv CROSS_COMPILE=$(TEMP_PATH)/riscv64-unknown-linux-musl- -C $(KERN_DIR) cvitek_cv1800b_milkv_duo_sd_defconfig
make ARCH=riscv CROSS_COMPILE=$(TEMP_PATH)/riscv64-unknown-linux-musl- -C $(KERN_DIR)
obj-m += helloworld.o
最后一行是你的源文件,第一行是你的sdk位置
注意,一定要改这些。
再新建helloworld.c
#include <linux/kernel.h>
#include <linux/module.h>
// 当驱动被加载的时候,执行此函数
static int __init hello_init(void)
{
printk("welcome, hello\n");
return 0;
}
// 当驱动被卸载的时候,执行此函数
static void __exit hello_exit(void)
{
printk("bye, hello\n");
}
// 版权声明
MODULE_LICENSE("GPL");
// 以下两个函数属于 Linux 的驱动框架,只要把驱动两个函数地址注册进去即可。
module_init(hello_init);
module_exit(hello_exit);
建好之后在当前目录打开命令行,输入:
make prebuild
如果你编译过内核,不用输入上面那行,否则要预编译
然后输入:
make all
之后当前目录就有一个helloworld.ko文件,就是编译好的内核模块。
上传到开发板上
sshpass -p milkv scp 你的文件夹/helloworld.ko root@192.168.42.1:~/
insmod加载模块,如下所示:
[root@milkv-duo]~# ls
helloworld.ko
[root@milkv-duo]~# insmod ./helloworld.ko
[root@milkv-duo]~#
输入dmesg | tail查看内核信息:
[root@milkv-duo]~# ls
helloworld.ko
[root@milkv-duo]~# insmod ./helloworld.ko
[root@milkv-duo]~# dmesg | tail
[ 3.665545] dwc2 4340000.usb: new device is high-speed
[ 3.743320] dwc2 4340000.usb: new address 7
[ 3.828876] IPv6: ADDRCONF(NETDEV_CHANGE): usb0: link becomes ready
[ 71.508843] bm-dwmac 4070000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
[ 71.508888] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[ 1213.011595] random: crng init done
[ 1213.011611] random: 1 urandom warning(s) missed due to ratelimiting
[ 3574.752501] welcome, hello
[root@milkv-duo]~#
可以看见printk(“welcome, hello\n”);语句已经正常执行了。
移除模块:
rmmod helloworld.ko
可以看见bye, hello正常打印。