linux SPI驱动——spidev之deive(五)

1.定义board设备
1: struct spi_board_info {  2: /* the device name and module name are coupled, like platform_bus;  3: * "modalias" is normally the driver name.  4: *  5: * platform_data goes to spi_device.dev.platform_data,  6: * controller_data goes to spi_device.controller_data,  7: * irq is copied too  8: */  9: char modalias[SPI_NAME_SIZE];  10: const void *platform_data;  11:void *controller_data;  12: int irq;  13:    14: /* slower signaling on noisy or low voltage boards */  15: u32 max_speed_hz;  16:    17:    18: /* bus_num is board specific and matches the bus_num of some  19: * spi_master that will probably be registered later.  20: *  21: * chip_select reflects how this chip is wired to that master;  22: * it's less than num_chipselect.  23: */  24: u16 bus_num;  25: u16 chip_select;  26:    27: /* mode becomes spi_device.mode, and is essential for chips  28: * where the default of SPI_CS_HIGH = 0 is wrong.  29: */  30: u8 mode;  31:    32: /* ... may need additional spi_device chip config data here.  33: * avoid stuff protocol drivers can set; but include stuff  34: * needed to behave without being bound to a driver:  35: * - quirks like clock rate mattering when not selected 36: */
1: /* add by xuyonghong for test */  2: struct spi_board_info jz_spi0_board_info[] = {  3: {  4:.modalias = "spidev",  5: .mode = SPI_MODE_3,  6: .max_speed_hz = 1000000,  7: .controller_data = (void *)GPIO_PB(2),  8: .bus_num = 0,  9: .chip_select = 0,  10: },  11: };  12: intjz_spi0_devs_size = ARRAY_SIZE(jz_spi0_board_info);
 
 
1: int __init  2: spi_register_board_info(struct spi_board_info const *info, unsigned n)  3: { 4: struct boardinfo *bi;  5: int i;  6:    7: bi = kzalloc(n * sizeof(*bi), GFP_KERNEL);  8: if(!bi)  9: return -ENOMEM;  10:    11: for (i = 0; i < n; i++, bi++, info++) {  12: structspi_master *master;  13:    14: memcpy(&bi->board_info, info, sizeof(*info));  15:mutex_lock(&board_lock);  16: list_add_tail(&bi->list, &board_list);  17: /*  18: 如果master先注册,则执行spi_match_master_to_boardinfo匹配,  19: 否则在master注册的时候匹配device  20: */  21:list_for_each_entry(master, &spi_master_list, list)  22: spi_match_master_to_boardinfo(master, &bi->board_info);  23: mutex_unlock(&board_lock);  24: }  25:    26: return 0;  27: }
1: spi_register_board_info(jz_spi0_board_info, jz_spi0_devs_size);

 

总结:

1. list_add_tail(&bi->list, &board_list); 讲board添加在board_list

2.当master已经注册,则通过spi_match_master_to_boardinfo和spi_new_device创建spi device。

你可能感兴趣的:(C,嵌入式Linux开发,C++)