====== Kernel Modules ====== ===== List factory default kernel modules ===== You can list the factory default kernel modules with the command: find /lib/modules/$(uname -r) -type f -name '*.ko' ===== Building ===== Tip: You can use [[https://github.com/dockcross/dockcross|Dockcross]] to cross-compile from a Docker container to the PM3. Use the ''dockcross/linux-armv7-lts'' container. - Download the i.MX Linux kernel source code from the [[https://github.com/nxp-imx/linux-imx/tree/v4.9.166|nxp-imx/linux-imx Github repo]], selecting the git tag that matches your kernel version (e.g. ''4.9.166'' for a ''uname -r'' of ''4.9.166-fsl-imx-INIT-004''). - Obtain the Linux kernel config from the PM3, located at ''/proc/config.gz''. Unzip this file to ''.config'' in the root of the kernel source. - In ''.config'', change the line ''CONFIG_LOCALVERSION_AUTO=y'' to ''CONFIG_LOCALVERSION_AUTO=n''. - If you're trying to build kernel modules that are already in the Linux source code, set the appropriate config options to ''m''. For example, setting ''CONFIG_SLIP=m'' enabled SLIP support to be compiled to ''drivers/net/slip/slip.ko''. - In ''Makefile'', change the line ''EXTRAVERSION ='' to ''EXTRAVERSION = -fsl-imx-INIT-004'', or whatever comes after the PM3's ''uname -r'' for you. - In ''/scripts/dtc/dtc-lexer.lex.c'' and ''/scripts/dtc/dtc-lexer.lex.c_shipped'', change ''YYLTYPE yylloc;'' to ''extern YYLTYPE yylloc;'' - Run ''git add .'' and ''git commit''. - Run ''make LOCALVERSION= -C . modules''. * If you are using Dockcross and you are in a bash environment inside the container, you may need to run ''sudo make'' instead of just ''make''. - ''scp'' your new kernel module to the PM3 and load it with ''insmod your_module.ko''. If it fails, check ''dmesg'' to see what's wrong. ==== Problems ==== If you fail to load a kernel module and dmesg shows something like the following: version magic '4.9.166-fsl-imx-INIT-004+ preempt ARMv7 p2v8 ' should be '4.9.166-fsl-imx-INIT-004 preempt ARMv7 p2v8 ' version magic '4.9.166-fsl-imx-INIT-004-dirty preempt ARMv7 p2v8 ' should be '4.9.166-fsl-imx-INIT-004 preempt ARMv7 p2v8 ' Then double check: * That ''CONFIG_LOCALVERSION_AUTO=n'' is set in ''.config''. * That your ''make'' command has the option ''LOCALVERSION= ''. * That you have no uncommitted changes according to git.