Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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$ 

...

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 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)

...