一、驱动程序结构

1、platform_device

文件:/arch/arm/mach-omap2/device.c

static struct omap2_mcspi_platform_config omap2_mcspi1_config = {
.num_cs = ,
}; static struct resource omap2_mcspi1_resources[] = {
{
.start = OMAP2_MCSPI1_BASE,
.end = OMAP2_MCSPI1_BASE + 0xff,
.flags = IORESOURCE_MEM,
},
}; static struct platform_device omap2_mcspi1 = {
.name = "omap2_mcspi",
.id = , /* 用于platform_driver probe函数中识别不同的设备 */
.num_resources = ARRAY_SIZE(omap2_mcspi1_resources),
.resource = omap2_mcspi1_resources,
.dev = {
  .platform_data = &omap2_mcspi1_config,
},
};
static inline void ti81xx_mcspi_fixup(void)
{
  omap2_mcspi1_resources[].start = TI81XX_MCSPI1_BASE;
  omap2_mcspi1_resources[].end = TI81XX_MCSPI1_BASE + 0xff; } static void omap_init_mcspi(void)
{
  if (cpu_is_ti81xx())
    ti81xx_mcspi_fixup()
platform_device_register(&omap2_mcspi1);
}

2、dev_devices

文件:/arch/arm/mach-omap2/board-ti8148ipnc.c

static struct spi_board_info dm8127_spi1_board[] = {
[] = {
.modalias = "spidev",
.bus_num = ,
.chip_select = ,
.irq = -,
.max_speed_hz = **,
.mode = SPI_MODE_0,
},
}; void __init ti8148_spi_init(void)
{ spi_register_board_info(dm8127_spi1_board,
ARRAY_SIZE(dm8127_spi1_board)); } int __init spi_register_board_info(struct spi_board_info const *info, unsigned n)
{
struct boardinfo *bi;
int i; bi = kzalloc(n * sizeof(*bi), GFP_KERNEL);
if (!bi)
return -ENOMEM; for (i = ; i < n; i++, bi++, info++) {
struct spi_master *master; memcpy(&bi->board_info, info, sizeof(*info));
mutex_lock(&board_lock);
list_add_tail(&bi->list, &board_list); /*加入board_list全局链表*/  
     list_for_each_entry(master, &spi_master_list, list)
spi_match_master_to_boardinfo(master, &bi->board_info);
mutex_unlock(&board_lock);
} return ;
}

1、platform_driver

文件:/driver/spi/omap2_mcspi.c

static const struct dev_pm_ops omap2_mcspi_pm_ops = {
.resume = omap2_mcspi_resume,
}; static struct platform_driver omap2_mcspi_driver = {
.driver = {
.name = "omap2_mcspi",
.owner = THIS_MODULE,
.pm = &omap2_mcspi_pm_ops
},
.remove = __exit_p(omap2_mcspi_remove),
}; static int __init omap2_mcspi_init(void)
{
omap2_mcspi_wq = create_singlethread_workqueue( /* 创建工作队列 */
omap2_mcspi_driver.driver.name);
if (omap2_mcspi_wq == NULL)
return -;
return platform_driver_probe(&omap2_mcspi_driver, omap2_mcspi_probe);
}

1、dev_driver

文件:/driver/spi/spidev.c

static struct spi_driver spidev_spi_driver = {
.driver = {
.name = "spidev",
.owner = THIS_MODULE,
},
.probe = spidev_probe,
.remove = __devexit_p(spidev_remove), };

SPI驱动框架-1(DM8127 Linux2.6.37为例)的更多相关文章

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

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

  2. SPI 驱动框架

    SPI 驱动框架 1. 枚举过程 drivers/spi/spi.c: spi_register_board_info /* 对于每一个spi_master,调用spi_match_master_to ...

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

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

  4. spi驱动框架全面分析,从master驱动到设备驱动

    内核版本:linux2.6.32.2  硬件资源:s3c2440 参考:  韦东山SPI视频教程 内容概括:     1.I2C 驱动框架回顾     2.SPI 框架简单介绍     3.maste ...

  5. Linux驱动修炼之道-SPI驱动框架源码分析(上)【转】

    转自:http://blog.csdn.net/lanmanck/article/details/6895318 SPI驱动架构,以前用过,不过没这个详细,跟各位一起分享: 来自:http://blo ...

  6. S3C2440 SPI驱动框架

    S3C2440 SPI驱动代码详细解读: https://www.linuxidc.com/Linux/2012-08/68402p4.htm 一.platform device and board_ ...

  7. Linux驱动:SPI驱动编写要点

    题外话:面对成功和失败,一个人有没有“冠军之心”,直接影响他的表现. 几周前剖析了Linux SPI 驱动框架,算是明白个所以然,对于这么一个庞大的框架,并不是每一行代码都要自己去敲,因为前人已经把这 ...

  8. RT Thread的SPI设备驱动框架的使用以及内部机制分析

    注释:这是19年初的博客,写得很一般,理解不到位也不全面.19年末得空时又重新看了RTThread的SPI和GPIO,这次理解得比较深刻.有时间时再整理上传. -------------------- ...

  9. 基于TQ2440的SPI驱动学习(OLED)

    平台简介 开发板:TQ2440 (NandFlash:256M  内存:64M) u-boot版本:u-boot-2015.04 内核版本:Linux-3.14 作者:彭东林 邮箱:pengdongl ...

随机推荐

  1. Unity Json 之三

    今天在网上看到一个simplejson,直接调用这两个API就可以了,简单易用 string jsonstr = SimpleJson.SimpleJson.SerializeObject(json) ...

  2. 高通LCD驱动调试

    本文转载自:http://www.itgo.me/a/x6305658852004979994/lcd%20qcom 来自 :http://blog.csdn.net/dacaozuo/article ...

  3. sg函数的应用

    刚刚接触到sg函数突然感觉到原来可以这么好用,sg函数应该算是博弈论中比较经典的东西了.下面来说说sg函数: 从网上搜集资料终于能看懂了下面解释来自http://www.cnblogs.com/cj6 ...

  4. spring boot 使用thymeleaf3.0以及thymeleaf的热部署

    spring boot 截止1.5.4,默认使用thymeleaf2.0,会有一些很蛋疼的地方比如xml格式之类的,具体哪些就不说了 -> 替换为3.0版本 pom中加入 <propert ...

  5. js的值类型和引用类型

    (1)值类型:String.Boolean.Number.null.undefined.(原始值) var a = 2; var b = a; b=3; a ==>2; b  ==>3 原 ...

  6. php中浮点型变量

    $d = (0.1+0.7)*10;//$d为8 //floor函数返回不大于value的最接近的整数,舍去小数部分取整 $e = floor($d);//$e为7 为什么$e为7,而不是8 因为$d ...

  7. java.lang.Exception: No runnable methods at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:191)

    使用方法测试时出现以下错误 java.lang.Exception: No runnable methods at org.junit.runners.BlockJUnit4ClassRunner.v ...

  8. spring boot: 组合注解与元注解

    package ch2.annotation; //target/elementType用来设定注解的使用范围 import java.lang.annotation.ElementType; imp ...

  9. SpringBoot邮件发送功能

    快速入门 在Spring Boot的工程中的pom.xml中引入spring-boot-starter-mail依赖: <dependency> <groupId>org.sp ...

  10. Pdf 解密后复制文字乱码

    1.安装cajviewer 这个工具 2.用CAJviewer打开pdf文档 3.选择图像4.点文字识别,这时候就弹窗一个框,里面是可复制的文本,而且准确率比较高