Create a Folder "hello" ; put the following hello.c & Makefile in this folder.
hello.c :
#include <linux/platform_device.h>
#include <linux/kernel.h>
#include <asm/uaccess.h>
#include <asm/system.h>
#include <linux/miscdevice.h>
#include <linux/input.h>
#include <linux/module.h>
#include <linux/init.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/slab.h>
#include <linux/i2c.h>
#include <linux/pm.h>
#include <linux/mutex.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/hwmon-sysfs.h>
#include <linux/err.h>
#include <linux/hwmon.h>
#include <linux/input-polldev.h>
#include <linux/random.h>
#include <linux/string.h>
#include <linux/gpio.h>
static int hello_init(void) {
printk(KERN_INFO "Hello kernel\n");
return 0;
}
static void hello_exit(void) {
printk(KERN_INFO "Goodbye\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("jasonc@mail2000.com.tw");
The file may be as simple as a single line:
obj-m := <module_name>.o
Makefile :
obj-m := hello.o
Cross-Build
Change to the hello folder and build:
make V=1 CROSS-COMPILE=arm-eabi- ARCH=arm -C ../kernel M=`pwd` modules
The "./kernel" description above is the kernel source tree. Use "V=1" could detail all the compilation mssages.
root@bebop:~/rockchip/firefly-rk3288-pad/hello# make V=1 CROSS-COMPILE=arm-eabi- ARCH=arm -C ../kernel M=`pwd` modules make: Entering directory `/root/rockchip/firefly-rk3288-pad/kernel' test -e include/generated/autoconf.h -a -e include/config/auto.conf || ( \ echo >&2; \ echo >&2 " ERROR: Kernel configuration is invalid."; \ echo >&2 " include/generated/autoconf.h or include/config/auto.conf are missing.";\ echo >&2 " Run 'make oldconfig && make prepare' on kernel src to fix it."; \ echo >&2 ; \ /bin/false) ... /root/rockchip/firefly-rk3288-pad/hello/hello.o /root/rockchip/firefly-rk3288-pad/hello/hello.mod.o make: Leaving directory `/root/rockchip/firefly-rk3288-pad/kernel' root@bebop:~/rockchip/firefly-rk3288-pad/hello#
root@bebop:~/rockchip/firefly-rk3288-pad/hello# ls Makefile modules.order Module.symvers hello.c hello.ko hello.mod.c hello.mod.o hello.o @bebop:~/rockchip/firefly-rk3288-pad/hello#
To clean: make V=1 CROSS-COMPILE=arm-eabi- ARCH=arm -C ../kernel M=`pwd` clean
An Example about Multiple C Files into 1 Kernel Module
... obj-m := rtw.o rtw-y := core/rtw_cmd.o \ core/rtw_security.o \ core/rtw_debug.o \ core/rtw_io.o \ ...
If Need Any Additional Include
Try use ccflags-y .
... ccflags-y := \ -I/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/include \ -I/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/hal/phydm \ -I/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/hal/btc \ -I/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/platform \ -DCONFIG_LITTLE_ENDIAN \ -DDM_ODM_SUPPORT_TYPE=ODM_CE \ -DEFUSE_MAP_PATH=\"/system/etc/wifi/wifi_efuse.map\" \ -DHCI_NAME=\"usb\" \ -DCONFIG_RTL8821C=\"y\" ...
to build Kernel modules, Try
make CROSS-COMPILE=arm-linux-gnueabihf- ARCH=arm -C ../kernel-dmc M=`pwd` modules
jasonc@bebop:~/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525$ make CROSS-COMPILE=arm-linux-gnueabihf- ARCH=arm -C ../kernel-dmc M=`pwd` modules make: Entering directory `/home/jasonc/rk30-linux/kernel-dmc' CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_cmd.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_security.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_debug.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_io.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_ioctl_query.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_ioctl_set.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_ieee80211.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_mlme.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_mlme_ext.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_mi.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_wlan_util.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_vht.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_pwrctrl.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_rf.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_recv.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_sta_mgt.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_ap.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_xmit.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_p2p.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_rson.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_tdls.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_br_ext.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_iol.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_sreset.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_btcoex_wifionly.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_btcoex.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_beamforming.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/rtw_odm.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/core/efuse/rtw_efuse.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/hal/hal_halmac.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/hal/hal_intf.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/hal/hal_com.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/hal/hal_com_phycfg.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/hal/hal_phy.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/hal/hal_dm.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/hal/hal_dm_acs.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/hal/hal_btcoex_wifionly.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/hal/hal_btcoex.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/hal/hal_mp.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/hal/hal_mcc.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/hal/hal_hci/hal_usb.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/hal/led/hal_usb_led.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/hal/btc/halbtc8723bwifionly.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/hal/btc/halbtc8822bwifionly.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/hal/btc/halbtc8821cwifionly.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/os_dep/osdep_service.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/os_dep/linux/os_intfs.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/os_dep/linux/usb_intf.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/os_dep/linux/usb_ops_linux.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/os_dep/linux/ioctl_linux.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/os_dep/linux/xmit_linux.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/os_dep/linux/mlme_linux.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/os_dep/linux/recv_linux.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/os_dep/linux/ioctl_cfg80211.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/os_dep/linux/rtw_cfgvendor.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/os_dep/linux/wifi_regd.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/os_dep/linux/rtw_android.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/os_dep/linux/rtw_proc.o CC [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/platform/platform_arm_act_sdio.o LD [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.o Building modules, stage 2. MODPOST 1 modules WARNING: "recvbuf2recvframe" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "phydm_c2H_content_parsing" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "halmac_init_adapter" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "init_hal_spec_rtl8821c" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "phydm_cmn_sta_info_hook" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "halrf_cmn_info_get" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "phydm_fwoffload_ability_init" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "halrf_cmn_info_init" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "odm_cmn_info_init" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "odm_acquire_spin_lock" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "phydm_cmn_info_query" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "halrf_lck_trigger" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "odm_pause_dig" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "odm_cmn_info_ptr_array_hook" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "rtl8821cu_set_hal_ops" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "odm_write_dig" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "phydm_ra_registed" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "EFUSE_IsAddressMasked_MP_8821C_MUSB" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "phydm_watchdog" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "odm_cmn_info_hook" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "odm_cmn_info_update" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "odm_config_rf_with_header_file" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "halmac_get_version" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "EFUSE_GetArrayLen_MP_8821C_MUSB" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "halmac_deinit_adapter" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "phydm_adaptivity_info_init" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "halrf_cmn_info_set" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "phydm_watchdog_lps" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "phydm_init_debug_setting" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "phydm_fwoffload_ability_clear" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "odm_release_spin_lock" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "phydm_cmd" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "rtl8821cu_set_hw_type" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "odm_config_bb_with_header_file" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "EFUSE_GetMaskArray_MP_8821C_MUSB" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "odm_phy_status_query" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! WARNING: "halrf_segment_iqk_trigger" [/home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko] undefined! CC /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.mod.o LD [M] /home/jasonc/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525/rtw.ko make: Leaving directory `/home/jasonc/rk30-linux/kernel-dmc' jasonc@bebop:~/rk30-linux/rtl8821CU_WiFi_linux_v5.2.15.2_27778.20180515_COEX20171114-2525$
Git 設定 Upstream
$ git branch foo ... $ git branch --set-upstream-to=origin/foo ...
Reference:
https://www.kernel.org/doc/Documentation/kbuild/modules.txt