linux SPI駆動-spidevのdeive(五)
3142 ワード
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:そうでなければマスター登録時にデバイスにマッチ
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_デバイスspiデバイスを作成します.