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: int jz_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: struct spi_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。

linux SPI驱动——spidev之deive(五)的更多相关文章

  1. linux SPI驱动——spidev之driver(六)

    一: spidev_init注册spidev 1: static int __init spidev_init(void) 2: { 3: int status; 4:   5: /* Claim o ...

  2. Linux spi驱动分析(二)----SPI核心(bus、device_driver和device)

    一.spi总线注册 这里所说的SPI核心,就是指/drivers/spi/目录下spi.c文件中提供给其他文件的函数,首先看下spi核心的初始化函数spi_init(void).程序如下: 点击(此处 ...

  3. linux驱动基础系列--linux spi驱动框架分析

    前言 主要是想对Linux 下spi驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型等也不进行详细说明原理.如果有任何错误地方,请指出,谢谢! spi ...

  4. linux设备驱动归纳总结(五):4.写个简单的LED驱动【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-84693.html linux设备驱动归纳总结(五):4.写个简单的LED驱动 xxxxxxxxxxx ...

  5. linux设备驱动归纳总结(五):3.操作硬件——IO静态映射【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-83299.html linux设备驱动归纳总结(五):3.操作硬件——IO静态映射 xxxxxxxxx ...

  6. linux设备驱动归纳总结(五):1.在内核空间分配内存【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-79134.html linux设备驱动归纳总结(五):1.在内核空间分配内存 xxxxxxxxxxxx ...

  7. linux驱动基础系列--linux spi驱动框架分析(续)

    前言 这篇文章是对linux驱动基础系列--linux spi驱动框架分析的补充,主要是添加了最新的linux内核里设备树相关内容. spi设备树相关信息 如之前的文章里所述,控制器的device和s ...

  8. 【Linux开发】linux设备驱动归纳总结(五):1.在内核空间分配内存

    linux设备驱动归纳总结(五):1.在内核空间分配内存 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  9. 【Linux开发】linux设备驱动归纳总结(五):2.操作硬件——IO内存

    linux设备驱动归纳总结(五):2.操作硬件--IO内存 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

随机推荐

  1. Use Razor for Email Template outside ASP.NET MVC

    原文发布时间为:2011-09-15 -- 来源于本人的百度文章 [由搬家工具导入] http://kazimanzurrashid.com/posts/use-razor-for-email-tem ...

  2. GMM 的EM 实现

    算法逻辑在这里: http://www.cnblogs.com/Azhu/p/4131733.html 贴之前先说下,本来呢是打算自己写一个的,在matlab 上,不过,实在是写不出来那么高效和健壮的 ...

  3. 反射的基本使用以及原理(Class获取方式)

    1.什么是反射技术? 动态获取指定类以及类中的内容(成员),并运行其内容. 应用程序已经运行,无法在其中进行new对象的建立,就无法使用对象.这时可以根据配置文件的类全名去找对应的字节码文件,并加载进 ...

  4. 【Visual Studio】error c4996: 'fopen': This function or variable may be unsafe(转)

    原文转自 http://blog.csdn.net/zhangyuehuan/article/details/12012635 [解决方案]项目 =>属性 =>c/c++  =>预处 ...

  5. 阿里云服务器 centos 7 安装postgresql 11

    Postgresql简介 官方网站:https://www.postgresql.org/ 简介参考zhihu文章 https://www.zhihu.com/question/20010554 关于 ...

  6. git的使用学习(六)git的标签管理

    发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一个快照 ...

  7. Codeforces Round #315 (Div. 2)【贪心/重排去掉大于n的元素和替换重复的元素】

    B. Inventory time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  8. 基于 OpenResty 的动态服务路由方案

    2019 年 5 月 11 日,OpenResty 社区联合又拍云,举办 OpenResty × Open Talk 全国巡回沙龙武汉站,又拍云首席布道师在活动上做了< 基于 OpenResty ...

  9. UVA - 1205 Color a Tree

    大意就是给你一颗树,每个点有一个权值w[i],求一个排列使得 所有的父亲都在儿子前面 并且排列的权值最小. 排列的权值在这里定义为 Σ i * w[p[i]]   ,其中p[i] 是排列第i个位置的元 ...

  10. MySQL OCP

    http://www.royalwzy.com/ http://www.aixchina.net/home/space.php?uid=898169