...
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:
...
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 sample simple kernel module with by setting up two files: hello.c and Makefile.
Content of 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"); |
Content of 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 |
Build module:
...
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' |
It This process will get generate a hello.ko and you can probe this module with insmod command. You will see this module with lsmod command. 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, please refer to below linkUbuntu:
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-1v1.0 cd[sudo] password /usrfor sunplus: sunplus@ubuntu:~$ cd /usr/src/mymodule-1v1.0/ sunplus@ubuntu:/usr/src/mymodule-v1.0$ sudo su echo -e "root@ubuntu:/usr/src/mymodule-v1.0# |
Then, create the following files:
Makefile:
Code Block |
---|
obj-m += mymodule.o\nall:\n\tmake all: make -C /lib/modules/\$(uname -r)/build M=\$(PWD) modules\nclean:\n\tmake clean: make -C /lib/modules/\$(uname -r)/build M=\$(PWD) clean" > /usr/src/mymodule-1.0/Makefile echo -e " clean |
mymodule.c:
Code Block |
---|
#include <linux/init.h>\n#include #include <linux/module.h>\nstatic static int __init mymodule_init(void) { return 0; }\nstatic static void __exit mymodule_exit(void) { }\nmodule module_init(mymodule_init);\nmodule module_exit(mymodule_exit);\nMODULE MODULE_LICENSE(\"GPL\");" > /usr/src/mymodule-1.0/mymodule.c echo -e ""GPL"); |
dkms.conf:
Code Block |
---|
PACKAGE_NAME=\"mymodule\"\nPACKAGE PACKAGE_VERSION=\"1.0\"\nBUILT BUILT_MODULE_NAME[0]=\"mymodule\"\nDEST DEST_MODULE_LOCATION[0]=\"/updates/dkms/\"\nAUTOINSTALL AUTOINSTALL=\"yes\"" > " |
Exit the superuser mode:
Code Block |
---|
root@ubuntu:/usr/src/mymodule-v1.0# exit exit sunplus@ubuntu:/usr/src/mymodule-1.0/dkms.conf exitv1.0$ |
Add,
...
Build and
...
Install DKMS Module
Add the module to system 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 linux-headers-$(KERNELRELEASE) cp -f $(LINUX_PATH)/Module.symvers linux-headers-$(KERNELRELEASE) $(MAKE_ARCH) $(MAKE_JOBS) -C $(LINUX_PATH) CROSS_COMPILE=$(CROSS_COMPILE_FOR_LINUX) mrproper $(MAKE_ARCH) $(MAKE_JOBS) -C $(LINUX_PATH) O=../../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) rm linux-headers-$(KERNELRELEASE)/source cp -rf $(LINUX_PATH)/include linux-headers-$(KERNELRELEASE) mkdir -p linux-headers-$(KERNELRELEASE)/arch cp -rf $(LINUX_PATH)/arch/arm64 linux-headers-$(KERNELRELEASE)/arch cp -f $(LINUX_PATH)/Makefile linux-headers-$(KERNELRELEASE) cp -rf $(LINUX_PATH)/scripts linux-headers-$(KERNELRELEASE) |
...