...
Table of Contents | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Download Source Files
Please refer to the A Guide to Downloading and Compiling SP7350 Code for downloading and compiling the source files for the SP7350 platform.
...
Code Block |
---|
wellslu@scdiu3:~/Q654$ ll linux-headers-5.10.201/ total 736 drwxr-xr-x 6 wellslu sp 4096 Apr 24 13:16 ./ drwxr-xr-x 12 wellslu sp 4096 Apr 24 13:16 ../ drwxr-xr-x 3 wellslu sp 4096 Apr 24 13:16 arch/ -rw-r--r-- 1 wellslu sp 135525 Apr 24 13:16 .config -rw-r--r-- 1 wellslu sp 39 Apr 24 13:16 .gitignore drwxr-xr-x 4 wellslu sp 4096 Apr 24 13:16 include/ drwxr-xr-x 2 wellslu sp 4096 Apr 24 13:16 kernel/ -rw-r--r-- 1 wellslu sp 141 Apr 24 13:16 Makefile -rw-r--r-- 1 wellslu sp 1044 Apr 24 13:16 .missing-syscalls.d -rw-r--r-- 1 wellslu sp 576967 Apr 24 13:16 Module.symvers drwxr-xr-x 8 wellslu sp 4096 Apr 24 13:16 scripts/ lrwxrwxrwx 1 wellslu sp 31 Apr 24 13:16 source -> /home/wellslu/Q654/linux/kernel/ wellslu@scdiu3:~/Q654$ |
Install Linux
...
Kernel-headers
Before using the Linux kernel headers, copy the linux-headers-5.10.201 folder to /usr/src/ on your target board. Refer to report of ll command in Ubuntu where linux-headers has been copied to:
...
Remove the soft link named source in /usr/src/linux-headers-5.10.201/ as it's unnecessary. Create a soft link named build at /lib/modules/5.10.201/ pointing to /usr/src/linux-headers-5.10.201:
Code Block |
---|
sunplus@ubuntu:/usr/src/linux-headers-5.10.201$ sudo rm source sunplus@ubuntu:/usr/src/linux-headers-5.10.201$ sudo ln -s /usr/src/linux-headers-5.10.201 /lib/modules/5.10.201/build sunplus@ubuntu:/usr/src/linux-headers-5.10.201$ ll /lib/modules/5.10.201/build/ total 736 drwxr-xr-x 6 4031 501 4096 Mar 27 21:53 ./ drwxr-xr-x 3 root root 4096 Mar 27 21:50 ../ drwxr-xr-x 3 4031 501 4096 Apr 24 2024 arch/ -rw-r--r-- 1 4031 501 135525 Apr 24 2024 .config -rw-r--r-- 1 4031 501 39 Apr 24 2024 .gitignore drwxr-xr-x 4 4031 501 4096 Apr 24 2024 include/ drwxr-xr-x 2 4031 501 4096 Apr 24 2024 kernel/ -rw-r--r-- 1 4031 501 141 Apr 24 2024 Makefile -rw-r--r-- 1 4031 501 1044 Apr 24 2024 .missing-syscalls.d -rw-r--r-- 1 4031 501 576967 Apr 24 2024 Module.symvers drwxr-xr-x 8 4031 501 4096 Apr 24 2024 scripts/ sunplus@ubuntu:/usr/src/linux-headers-5.10.201$ |
Appendix: List of target headers in Makefile
...
Generate kernel scripts for aarch64 and copy scripts to /usr/src/linux-headers-5.10.201
Code Block |
---|
sudo apt update
sudo apt install build-essential fakeroot libncurses5-dev libssl-dev ccache libncurses-dev bison flex libelf-dev
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.201.tar.xz
tar -xf linux-5.10.201.tar.xz
cd linux-5.10.201
cp /usr/src/linux-headers-5.10.201/.config ./
make oldconfig
make prepare
make modules_prepare
make scripts
sudo cp -rf scripts/ /usr/src/linux-headers-5.10.201/ |
Build a Kernel Module (an example)
To ensure compatibility, update your GCC version to 12.3:
Code Block |
---|
sudo apt-get install gcc-12
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12 |
Create a simple kernel module by setting up two files: hello.c and Makefile.
hello.c:
Code Block |
---|
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
static int __init hello_init(void)
{
printk(KERN_INFO "Hello, World!\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "Goodbye, World!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple Hello World Kernel Module"); |
Makefile:
Code Block |
---|
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean |
Navigate to your module directory and build it using the make command. You should see output similar to this:
Code Block |
---|
sunplus@ubuntu:~/code/module-temp$ make
make -C /lib/modules/5.10.201/build M=/home/sunplus/code/module-temp modules
make[1]: Entering directory '/usr/src/linux-headers-5.10.201'
CC [M] /home/sunplus/code/module-temp/hello.o
MODPOST /home/sunplus/code/module-temp/Module.symvers
CC [M] /home/sunplus/code/module-temp/hello.mod.o
LD [M] /home/sunplus/code/module-temp/hello.ko
make[1]: Leaving directory '/usr/src/linux-headers-5.10.201' |
This process will generate a hello.ko file, which is the compiled kernel module.
You can load the compiled module into the kernel with the insmod command and verify its presence with lsmod:
Code Block |
---|
sunplus@ubuntu:~/code/module-temp$ sudo insmod hello.ko
sunplus@ubuntu:~/code/module-temp$ lsmod
Module Size Used by
hello 16384 0
galcore 794624 0
edt_ft5x06 32768 0
sp7350_rng 16384 0
rng_core 24576 1 sp7350_rng |
Build a Kernel Module with DKMS
Dynamic Kernel Module Support (DKMS) allows you to automatically rebuild kernel modules when a new kernel is installed. Refer to below link for an introduction of DKMS in Ubuntu:
dkms - Dynamic Kernel Module Support
Install DKMS
Code Block |
---|
sudo apt install dkms |
Create a Sample DKMS Module
First, set up a new directory and create the necessary files:
Code Block |
---|
sunplus@ubuntu:~$ sudo mkdir -p /usr/src/mymodule-v1.0
[sudo] password for sunplus:
sunplus@ubuntu:~$ cd /usr/src/mymodule-v1.0/
sunplus@ubuntu:/usr/src/mymodule-v1.0$ sudo su
root@ubuntu:/usr/src/mymodule-v1.0# |
Then, create the following files:
Makefile:
Code Block |
---|
obj-m += mymodule.o
all:
make -C /lib/modules/$(uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(uname -r)/build M=$(PWD) clean |
mymodule.c:
Code Block |
---|
#include <linux/init.h>
#include <linux/module.h>
static int __init mymodule_init(void)
{
return 0;
}
static void __exit mymodule_exit(void)
{
}
module_init(mymodule_init);
module_exit(mymodule_exit);
MODULE_LICENSE("GPL"); |
dkms.conf:
Code Block |
---|
PACKAGE_NAME="mymodule"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME[0]="mymodule"
DEST_MODULE_LOCATION[0]="/updates/dkms/"
AUTOINSTALL="yes" |
Exit the superuser mode:
Code Block |
---|
root@ubuntu:/usr/src/mymodule-v1.0# exit
exit
sunplus@ubuntu:/usr/src/mymodule-v1.0$ |
Add, Build and Install DKMS Module
Add the module to DKMS:
Code Block |
---|
sunplus@ubuntu:/usr/src/mymodule-1.0$ sudo dkms add -m mymodule -v 1.0
Creating symlink /var/lib/dkms/mymodule/1.0/source -> /usr/src/mymodule-1.0 |
Build the module:
Code Block |
---|
sunplus@ubuntu:/usr/src/mymodule-1.0$ sudo dkms build -m mymodule -v 1.0
Kernel preparation unnecessary for this kernel. Skipping...
Building module:
cleaning build area...
make -j4 KERNELRELEASE=5.10.201 -C /lib/modules/5.10.201/build M=/var/lib/dkms/mymodule/1.0/build....
cleaning build area... |
Install the module:
Code Block |
---|
sunplus@ubuntu:/usr/src/mymodule-1.0$ sudo dkms install -m mymodule -v 1.0
mymodule.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/5.10.201/updates/dkms/
depmod... |
Load the module with modprobe and verify with lsmod:
Code Block |
---|
sunplus@ubuntu:/usr/src/mymodule-1.0$ sudo modprobe mymodule
sunplus@ubuntu:/usr/src/mymodule-1.0$ lsmod
Module Size Used by
mymodule 16384 0
hello 16384 0
galcore 794624 0
edt_ft5x06 32768 0
sp7350_rng 16384 0
rng_core 24576 1 sp7350_rng |
Appendix: List of Target headers in Makefile within build/ under Project Top-directory
Code Block |
---|
headers: @KERNELRELEASE=$(shell cat $(LINUX_PATH)/include/config/kernel.release 2>/dev/null) @if ! [ -f $(LINUX_PATH)/.config ]; then \ echo File \'$(LINUX_PATH)/.config\' does not exist!; \ exit 1; \ fi @if ! [ -f $(LINUX_PATH)/Module.symvers ]; then \ echo File \'$(LINUX_PATH)/Module.symvers\' does not exist!; \ exit 1; \ fi rm -rf linux-headers-$(KERNELRELEASE) mkdir -p linux-headers-$(KERNELRELEASE) cp -f $(LINUX_PATH)/.config ]; then \ echo File \'linux-headers-$(KERNELRELEASE) cp -f $(LINUX_PATH)/Module.config\' does not exist!; \ exit 1; \ fi @if ! [ -fsymvers linux-headers-$(KERNELRELEASE) $(MAKE_ARCH) $(MAKE_JOBS) -C $(LINUX_PATH)/Module.symvers ]; then \ echo File \' CROSS_COMPILE=$(CROSS_COMPILE_FOR_LINUX) mrproper $(MAKE_ARCH) $(MAKE_JOBS) -C $(LINUX_PATH) O=../Module.symvers\' does not exist!; \ exit 1; \ fi rm -rf ../linux-headers-$(KERNELRELEASE) CROSS_COMPILE=$(CROSS_COMPILE_FOR_LINUX) modules_prepare $(MAKE_ARCH) $(MAKE_JOBS) -C $(LINUX_PATH) headers_install INSTALL_HDR_PATH=../../linux-headers-$(KERNELRELEASE) CROSS_COMPILE=$(CROSS_COMPILE_FOR_LINUX) mkdir -prm linux-headers-$(KERNELRELEASE)/source cp -frf $(LINUX_PATH)/.configinclude linux-headers-$(KERNELRELEASE) cpmkdir -f $(LINUX_PATH)/Module.symversp linux-headers-$(KERNELRELEASE)/arch $(MAKE_ARCH) $(MAKE_JOBS) -Ccp -rf $(LINUX_PATH) CROSS_COMPILE=$(CROSS_COMPILE_FOR_LINUX) mrproper $(MAKE_ARCH) $(MAKE_JOBS) -C/arch/arm64 linux-headers-$(KERNELRELEASE)/arch cp -f $(LINUX_PATH)/Makefile linux-headers-$(KERNELRELEASE) cp -rf $(LINUX_PATH) O=../..//scripts linux-headers-$(KERNELRELEASE) CROSS_COMPILE=$(CROSS_COMPILE_FOR_LINUX) modules_prepare |