Q: How to write a Linux kernel device driver for custom hardware (I2C/SPI/GPIO)?
Answer
For I2C/SPI kernel drivers: use the Linux kernel subsystem APIs. I2C: implement struct i2c_device_id table and probe()/remove() functions using i2c_master_send()/i2c_master_recv(). SPI: use struct spi_device with spi_write_then_read() or spi_sync(). For character devices: register with register_chrdev() and create a device node with class_create()/device_create(). Use struct cdev for file operations (open read write ioctl). For GPIO use gpiod_get()/gpiod_direction_output() from gpiolib. Kernel module best practices: use devm_kzalloc() for managed memory; implement suspend/resume callbacks (pm_runtime); use dev_err/dev_info for logging. Device tree binding: add a node under your bus with compatible string matching the driver MODULE_DEVICE_TABLE.
Filed under: FAQ
