When writing drivers, it is generally necessary to add node information to the device tree, which provides a way to add device information directly to the drive.
The drive template for I²c is as follows
#include <linux/module.h> #include <linux/i2c.h> #define Sensor_bus_num 0#define sensor_slave_address 0x3e #define SENSOR_NAME "SENSOR" struct i2c_client *sensor_client=null;static int sensor_probe (struct i2c_client *client, const struct I2C_DEVICE_ID *id) { sensor_client=client; return 0;} static int sensor_remove (struct i2c_client *client) { return 0;} static const struct I2C_DEVICE_ID sensor_id[] = { {sensor_name, 0}, {}}; Module_device_table (I²c, sensor_id); static struct I2c_driver sensor_driver = { . Driver = { . Name = sensor_name, }, .probe = sensor_probe, .remove = sensor_remove, . id_table = sensor_id,};static struct I2c_board_info sensor_device = { I2c_board_info (" HMC5883L-I2C ", SEnsor_slave_address),};static int __init sensor_init (void) { struct I2c_adapter *adap; struct i2c_client *client; adap = I2c_get_adapter (sensor_bus_num); if (! ADAP) { PRINTK ("I²c adapter%d\n", Sensor_bus_num); return-enodev; } else { PRINTK ("Get Ii2 Adapter%d ok\n", sensor_bus_num); client = I2c_new_device (ADAP, & Amp;sensor_device); } if (!client) { PRINTK ("Get i²c client%s @ 0x%02x fail!\n", sensor_device.type, sensor_device.addr); return -enodev; } else { printk ("GET i²c client ok!\n "); } i2c_put_adapter (ADAP); i2c_add_driver (&sensor_driver); &NBSP;PRINTK ("sensor init success!\n"); return 0; static void __exit sensor_exit (void) { i2c_del_driver (&sensor_driver); if ( Sensor_client!=null) i2c_unregister_device (sensor_client); printk ("Module Removed\n ");} Module_init (Sensor_init); Module_exit (sensor_exit); Odule_author ("GPL"); Odule_license ("GPL");
The SPI driver template is as follows
#include <linux/module.h> #include <linux/spi/spi.h> #define DEVICE_NAME "sensor" #define Sensor_spi_bus 0struct spi_device *sensor_spi=null;int sensor_spi_write (void) {return 0;} int Sensor_spi_read (void) {return 0;} static const struct SPI_DEVICE_ID sensor_spi_id[] = {{device_name, 0},{}}; Module_device_table (SPI, sensor_spi_id), static int sensor_probe (struct spi_device *spi) {Sensor_spi=spi;return 0;} static int sensor_remove (struct spi_device *spi) {return 0;} static struct Spi_driver sensor_driver = {. Driver = {. Name = Device_name,.owner = This_module,},.probe = Sensor_probe ,. remove = Sensor_remove,.id_table = sensor_spi_id,};static __init int sensor_spi_init (void) {int status=-1;struct spi_ Master *master;struct spi_device *spi;struct spi_board_info chip ={. Modalias = device_name,. Mode = 0x00,. Bus_num = 0,. Chip_select = 0,. max_speed_hz = 2000000,};spi_register_driver (&sens Or_driver), if (status<0) {Pr_err ("%s:spi_register_driver spi_driver failure. Status =%d\n ", __func__, status);} Pr_err ("%s:spi_register_driver spi_driver success. Status =%d\n ", __func__, status); master = Spi_busnum_to_master (Sensor_spi_bus); if (!master) {status =-enodev; Goto Error_busnum; } SPI = Spi_new_device (master, &chip); if (!SPI) {status =-ebusy; Goto Error_mem; }return Status;error_mem:error_busnum:spi_unregister_driver (&sensor_driver); return status;} static __exit void Sensor_spi_exit (void) {spi_unregister_driver (&sensor_driver); if (sensor_spi!=null) spi_ Unregister_device (SENSOR_SPI);} Module_init (Sensor_spi_init); Module_exit (Sensor_spi_exit); Module_license ("GPL v2");
The SPI and IIC drivers under Linux are not programmed to add device information on the device tree