Skip to content

Instantly share code, notes, and snippets.

@rikka0w0
Last active January 18, 2024 00:16
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rikka0w0/e0cdf483aa9f11397d01efbd2156d891 to your computer and use it in GitHub Desktop.
Save rikka0w0/e0cdf483aa9f11397d01efbd2156d891 to your computer and use it in GitHub Desktop.
Build kernel module for Armbian with 4.19.20 kernel
  1. Get the kernel headers from https://apt.armbian.com/pool/main/l/linux-4.19.20-sunxi/
  2. Download and unzip the linux-headers-next-sunxi_5.75_armhf.deb file and then unzip the data.tar.xz
  3. Extract /./usr/src/linux-headers-4.19.20-sunxi to any location
  4. Goto that folder, execute ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make scripts. Athough it throws tons of error, it should be able to build the necessary scripts.
  5. Makefile:
export ARCH:=arm
export CROSS_COMPILE:=arm-linux-gnueabihf-

CC=$(CROSS_COMPILE)gcc
KDIR:=/path/to/linux-headers-4.19.20-sunxi

obj-m += mymodule.o

all:
	make -C $(KDIR) M=$(shell pwd) modules
clean:
	make -C $(KDIR) M=$(shell pwd) clean
  1. Demo kernel module (mymodule.c):
/**
 * @file    hello.c
 * @author  Derek Molloy
 * @date    4 April 2015
 * @version 0.1
 * @brief  An introductory "Hello World!" loadable kernel module (LKM) that can display a message
 * in the /var/log/kern.log file when the module is loaded and removed. The module can accept an
 * argument when it is loaded -- the name, which appears in the kernel log files.
 * @see http://www.derekmolloy.ie/ for a full description and follow-up descriptions.
*/
 
#include <linux/init.h>             // Macros used to mark up functions e.g., __init __exit
#include <linux/module.h>           // Core header for loading LKMs into the kernel
#include <linux/kernel.h>           // Contains types, macros, functions for the kernel
 
MODULE_LICENSE("GPL");              ///< The license type -- this affects runtime behavior
MODULE_AUTHOR("Derek Molloy");      ///< The author -- visible when you use modinfo
MODULE_DESCRIPTION("A simple Linux driver for the BBB.");  ///< The description -- see modinfo
MODULE_VERSION("0.1");              ///< The version of the module
 
static char *name = "world";        ///< An example LKM argument -- default value is "world"
module_param(name, charp, S_IRUGO); ///< Param desc. charp = char ptr, S_IRUGO can be read/not changed
MODULE_PARM_DESC(name, "The name to display in /var/log/kern.log");  ///< parameter description
 
/** @brief The LKM initialization function
 *  The static keyword restricts the visibility of the function to within this C file. The __init
 *  macro means that for a built-in driver (not a LKM) the function is only used at initialization
 *  time and that it can be discarded and its memory freed up after that point.
 *  @return returns 0 if successful
 */
static int __init helloBBB_init(void){
   printk(KERN_INFO "EBB: Hello %s from the BBB LKM!\n", name);
   return 0;
}
 
/** @brief The LKM cleanup function
 *  Similar to the initialization function, it is static. The __exit macro notifies that if this
 *  code is used for a built-in driver (not a LKM) that this function is not required.
 */
static void __exit helloBBB_exit(void){
   printk(KERN_INFO "EBB: Goodbye %s from the BBB LKM!\n", name);
}
 
/** @brief A module must use the module_init() module_exit() macros from linux/init.h, which
 *  identify the initialization function at insertion time and the cleanup function (as
 *  listed above)
 */
module_init(helloBBB_init);
module_exit(helloBBB_exit);
``

References:
1. https://linux-sunxi.org/Mainline_Kernel_Howto
2. https://linux-sunxi.org/USB_Gadget/Mass_storage#Kernel_support
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment