前一篇,我们编写了驱动框架。
其中,使用了一个函数add_gpio_pmodoled_device_to_bus()
现在,我们看看这个函数做哪些工作。

static int __init add_gpio_pmodoled_device_to_bus(struct gpio_pmodoled_device* dev) {struct spi_master *spi_master;struct spi_device *spi_device;int status = 0;spi_master = spi_busnum_to_master(dev->spi_id);if(!spi_master) {dev_err(&dev->pdev->dev, "spi_busnum_to_master(%d) returned NULL\n", dev->spi_id);return -ENOSYS;}spi_device = spi_alloc_device(spi_master);if(!spi_device) {put_device(&spi_master->dev);dev_err(&dev->pdev->dev, "spi_alloc_device() failed\n");return -ENOMEM;}spi_device->chip_select = 0;spi_device->max_speed_hz = 4000000;spi_device->mode = SPI_MODE_0;spi_device->bits_per_word = 8;spi_device->controller_data = (void *) dev->iCS;spi_device->dev.platform_data = dev;strlcpy(spi_device->modalias, SPI_DRIVER_NAME, sizeof(SPI_DRIVER_NAME));status = spi_add_device(spi_device);if(status < 0) {spi_dev_put(spi_device);dev_err(&dev->pdev->dev, "spi_add_device() failed %d\n", status);return status;}dev->spi = spi_device;put_device(&spi_master->dev);return status;
}

caller调用这个函数时,传递了一个指针,它是gpio_pmodoled_device型的指针。
首先定义一系列指针,后续作为句柄使用。

获取struct spi_master描述块的指针,并赋值给spi_master。后续作为句柄使用。
spi_busnum_to_master()负责获得这个描述块的指针,它利用传入的spi_id,在系统中查找描述块,从而获得指针。
判断spi_master的合法性。
如果为NULL,则非法。打印错误信息,直接return。
如果不为NULL,则继续执行。

分配一个SPIDEVICE描述块。
spi_alloc_device()负责在系统中分配一个SPIDEVICE描述块,并返回一个struct spi_device型的指针。将指针赋值给spi_device,它是一个struct spi_device型的指针。后续作为句柄使用。
判断spi_device的合法性。
如果为NULL,则非法。首先在SPIMASTER上登记一个P操作,然后打印错误信息,直接return。
put_device()负责在一个设备资源的队列上登记一个P操作。
如果不为NULL,则继续执行。

填充SPIDEVICE。
chip_select,max_speed_hz,mode,bits_per_word,controller_data,dev.platform_data,
modalias。
把填充好的SPIDEVICE注册到系统中去。
spi_add_device()负责将SPIDEVICE描述块注册到系统中去。然后返回状态值。

判断返回状态值。
如果非法,则首先在SPIDEVICE上登记一个P操作,然后打印错误信息,直接return.
spi_dev_put()负责在一个SPI设备资源的队列上登记一个P操作。
如果合法,则继续执行。

将注册好的SPIDEVICE描述块,关联到PMOD。
将spi_device指针赋值给PMOD的spi成员,使之定向到SPIDEVICE描述块。

在SPIMASTER上登记一个P操作。
put_device(&spi_master->dev);

至此,全部执行完,return.

添加内核驱动模块(2)(mydriver.c+ Konfig+Makefile )相关推荐

  1. linux内核驱动模块开发makefile实例解析

    昨天整理了一篇关于linux内核驱动模块的开发介绍入门,其中介绍了一些关于驱动模块的基本开发步骤,不过面广而不深,很多细节都没有涉及到,其中就包括如何编写驱动模块的makefile.那么,今天我们就来 ...

  2. 《Linux内核驱动模块编程指南》

    Foreword Table of Contents 作者声明 版本和注意 感谢 译者注 作者声明 <Linux内核驱动模块编程指南>最初是由Ori Pomerantz为2.2版本的内核编 ...

  3. 超详细!手把手演示编译OpenWrt内核驱动模块

    一.前言 构建自己的内核驱动模块,相关知识可以参考OpenWrt软件编译构建系统文章:https://dongshao.blog.csdn.net/article/details/102545618. ...

  4. xmake v2.6.2 发布,新增 Linux 内核驱动模块构建支持

    Xmake 是一个基于 Lua 的轻量级跨平台构建工具. 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时. 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLis ...

  5. linux内核驱动模块开发步骤及实例入门介绍

    最近在搞一个linux的项目,其中主要是在编写一些应用模块,对内核及其驱动模块涉及很少,遇到了一些驱动模块的问题时,临时查了些资料,大致了解了一下驱动模块开发的基本步骤和常规步骤,并从网上也收集到了一 ...

  6. 【学习笔记】编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译

    本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录,就可以发现源码目录及其子目录中有很多的KConfig文件和Makefile文件.这些文件什么作用呢?正是这些文件组成了Linux ...

  7. 编译arm linux内核,编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译...

    转载自:http://blog.csdn.net/newthinker_wei/article/details/8022696 本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录, ...

  8. 无法添加内核模式驱动的打印机

    症状描述 添加共享打印机时出现错误提示:"当前打印机驱动程序与计算机上启用的某个策略不兼容",导致无法添加成功. 原因分析 因为内核模式可以访问系统底层的内存,因此写得不好的内核模 ...

  9. Arm开发板内核驱动模块--Helloworld及Makefile

    1. 在/home/sxy/目录下新建hello_1文件夹,在此文件夹下编写hello.c和Makefile文件(假设已经编写好了),make生成模块文件: PS:hello.ko就是用于需要使用的驱 ...

  10. Linux内核驱动模块示例--Helloword及Makefile

    先看一个最简单的驱动程序: //hello.c #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE ...

最新文章

  1. 计算机基础办公软件应用技能,计算机一级计算机基础及 ms office 应用考些什么...
  2. 第二十五章 面向对象------封装、内置函数、反射、动态导入
  3. git管理大项目或者大文件
  4. ORACLE安装参数修改
  5. 如何利用阿里云安全产品加强你的网站防护能力
  6. QT 5.9.8在ubuntu16.04下安装配置
  7. boost::bad_function_call用法的测试程序
  8. 【云上创新】阿里云视频云分享全场景音视频服务背后的场景探索与技术实践
  9. [模板]洛谷T3379 最近公共祖先(LCA) 倍增+邻接表
  10. python3-numpy np.nditer 迭代数组、np.nditer修改数组、np.nditer广播迭代
  11. 第5章 编写主引导扇区代码
  12. Halcon基本例程(二)
  13. 第一型曲面积分的总结思考
  14. FusionChart样例
  15. Linux安装PHP环境LNMP
  16. PHP array(递归)转xml,xml转array
  17. ArcGIS Pro2.5安装步骤(含Pro2.5安装包)
  18. 在微信收藏笔记中的录音文件拷贝或另存问题--适用于silk无法导出,看不见的情况
  19. 读取raw格式数据,OpenCV显示
  20. 在win10中安装caffe并配置MATLAB和Python接口(支持GPU加速)

热门文章

  1. Android 基于x5Webview 浏览文件 office文档
  2. Kettle文件下载
  3. JAVA刷视频代码,Java+adb命令实现自动刷视频脚本
  4. Eclipse用SVN上传新项目
  5. 西门子dcs系统组态手册下载_PLC/DCS/HMI 知识普及
  6. java 如何执行dig 命令_如何直接在cmd下执行Dig命令
  7. 多实例学习PCNN在关系抽取中的应用
  8. 谷粒商城--分布式基础篇1
  9. mac下安装win7虚拟机
  10. linux rman备份与恢复,RMAN备份与恢复 —— 完全恢复与不完全恢复