====== 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.