Embedded linux driver load-up - linux

I'm developing a device driver for embedded linux(ARM).
How can I compile the KO file generated as a part of the kernel,
in a way that the module will be loaded in boot ?
this is the first time I need to compile the driver into the kernel and not as a loadable module. so I'm not sure how to do it.
Thanks,
Ramon.

For your first question, I assume that you want to build your driver statically into the kernel image(not as a module). First, you select a directory in drivers directory where you want to put your driver files. Assume you want to put your files in drivers/char/. Copy your files into this directory. There will be a Kconfig file in the drivers/char/ directory, open it and add an entry like this in the before the endmenu.
config MYDRIVER
bool "This is a driver for something"
default n
help
This is a test driver.
Save the file and open Makefile in the same directory. Goto end of the file and add the following entry.
obj-$(CONFIG_MYDRIVER) += mydriver.o
That's it you have added the file to the kernel tree. Now, as usual, do make menuconfig and select MYDRIVER.
See this Kernel Compilation article for more info.

You need to build your device driver as a built-in. You can either edit your kernel .config file manually and change "=m" to "=y" for the CONFIG option that belongs to your module, or use make menuconfig to change <M> to <*> for your device driver.
before -> <M> Your Device Driver Name Here
after -> <*> Your Device Driver Name Here

Related

In which folder should I add the .ko file I compiled?

So I have compiled the driver for my USB wireless adapter.
Now I need to know where I should copy the .ko file to. The question is really the following:
What is the difference between
/lib/modules/(uname -r)/build
and
/lib/module/(uname -r)/kernel/drivers
?
Thank you already
When I add the .ko file to
/lib/module/(uname -r)/kernel/drivers/net/wireless/
the driver will be used to drive my USB adapter when I start the computer, at least when I execute 'depmod' after copying the file to a folder under .../kernel/drivers/net/wireless/ or .../kernel/net/wireless/
When I copy the driver to a folder under .../build the driver which is also a module isn't used to drive my USB adapter when I start the computer. Also when placed under build, 'modprobe' can't find the module after executing 'depmod'.
This actually tells me that .../build is never a good choice for placing a driver.

linux spi driver CONFIG

am new in linux and kernel compiling. I would like to add SPI support in my device - its stm32f429-disco evaluation board with LCD. I have found whole project here: https://github.com/jserv/stm32f429-linux-builder, compiled it and it works ( kernel source is https://github.com/robutest/uclinux ), but I don't know how to set CONFIG_STM32_SPI1 flag ( https://github.com/robutest/uclinux/blob/master/arch/arm/mach-stm32/spi.c line:45 ) in https://github.com/jserv/stm32f429-linux-builder/blob/master/configs/kernel_config.
I've checked https://github.com/robutest/uclinux/blob/master/arch/arm/mach-stm32/Kconfig and https://github.com/robutest/uclinux/blob/master/arch/arm/mach-stm32/Makefile and config flags looks ok. Adding manually CONFIG_SPI_STM32 and CONFIG_STM32_SPI1 to "kernel_config" doesn't work. Compiler removes both flags from this file.
Why CONFIG_STM32_SPIx and CONFIG_SPI_STM32 entries are not even visible like other entries "# CONFIG_STM32_USART1 is not set" in the original "kernel_config" file ( I also can't find STM32-SPI in 'make menuconfig' )?
From what you provide I suggest to add to your defconfig, namely kernel_config file from project you are using:
CONFIG_SPI=y
CONFIG_SPI_STM32=y
CONFIG_STM32_SPI1=y

driver not working when built as built in driver

I wrote a basic character driver for beagle-bone which prints two message in 1 second interval via a workqueue and a tasklet using printk.
At first i build it as module driver, generated .ko file, load it using insmod command and the print is coming when viewed via dmesg.
Then i built as inbuilt driver and load the uImage and after bootup i checked the dmesg prints. But there is no prints.
In the .config file
CONFIG_MY_DRIVER=y
So its taken as built in driver i think.
How can i confirm whether its actually built in the final image. No error was reported while building.
Is there any additional steps to be done for loading the build in driver.
Please pardon me if i went wrong on any basics. I am really new to linux.
This means that you added it probably somewhere to Kconfig file:
"CONFIG_MY_DRIVER=y"
but, Have you added it to Makefile? It works like that, then kernel during a building an Image, takes all of this directives "CONFIG_*" and use it to build particular source files from Makefile.
Example:
cat fs/ext2/Makefile
ext2-$(CONFIG_EXT2_FS_SECURITY) += xattr_security.o
cat fs/ext2/Kconfig
config EXT2_FS_SECURITY
bool "Ext2 Security Labels"
depends on EXT2_FS_XATTR
so in this example above if your source file is xattr_security.c then you should get xattr_security.o file in fs/ext2 dir, when this is build. You should also see it if your file is build, during a compilation process.

How to compile the linux kernel with an obsolete option?

OK, so I have this embedded kernel whose network card used to work fine with the LLTEMAC option. The new one with LL_TEMAC doesn't. I still see the code with LLTEMAC in the source, but not in the available option in the .config file:
$ ack-grep LLTEMAC
drivers/net/ethernet/xilinx/xilinx_lltemac/Makefile:10:obj-$(CONFIG_XILINX_LLTEMAC) := xilinx_temac.o
drivers/net/ethernet/xilinx/xilinx_lltemac/xlltemac_main.c:2: * Xilinx Ethernet: Linux driver for the XPS_LLTEMAC core.
drivers/net/ethernet/xilinx/xilinx_lltemac/xlltemac_main.c:452:#ifdef CONFIG_XILINX_LLTEMAC_MARVELL_88E1111_RGMII
...
include/linux/xilinx_devices.h:83:/* LLTEMAC platform data */
Is there a way to compile the kernel with this removed option ?
Simply adding CONFIG_XILINX_LLTEMAC=y CONFIG_XILINX_LLTEMAC_MARVELL_88E1111_GMII=y to the .config file does not do anything as the dislaimer states: # Automatically generated file; DO NOT EDIT.
Thanks.
Why not just update this individual driver to understand the new configuration option?

Linux device file is missing

I find the driver specific stuff in /sys/class/graphic/XM_403
But in /dev/ is no XM_403 file.
Here is the pertinent code.
graphic_class = class_create(THIS_MODULE,"graphic");
device_create(graphic_class,NULL,MKDEV(MAJOR_NR,minor),NULL,"XM_403");
device_create creates a file within the sysfs, exactly what you are seeing.
Usually it's udev that creates the device file.

Resources