添加内核驱动模块(2)(mydriver.c+ Konfig+Makefile )
前一篇,我们编写了驱动框架。
其中,使用了一个函数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 )相关推荐
- linux内核驱动模块开发makefile实例解析
昨天整理了一篇关于linux内核驱动模块的开发介绍入门,其中介绍了一些关于驱动模块的基本开发步骤,不过面广而不深,很多细节都没有涉及到,其中就包括如何编写驱动模块的makefile.那么,今天我们就来 ...
- 《Linux内核驱动模块编程指南》
Foreword Table of Contents 作者声明 版本和注意 感谢 译者注 作者声明 <Linux内核驱动模块编程指南>最初是由Ori Pomerantz为2.2版本的内核编 ...
- 超详细!手把手演示编译OpenWrt内核驱动模块
一.前言 构建自己的内核驱动模块,相关知识可以参考OpenWrt软件编译构建系统文章:https://dongshao.blog.csdn.net/article/details/102545618. ...
- xmake v2.6.2 发布,新增 Linux 内核驱动模块构建支持
Xmake 是一个基于 Lua 的轻量级跨平台构建工具. 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时. 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLis ...
- linux内核驱动模块开发步骤及实例入门介绍
最近在搞一个linux的项目,其中主要是在编写一些应用模块,对内核及其驱动模块涉及很少,遇到了一些驱动模块的问题时,临时查了些资料,大致了解了一下驱动模块开发的基本步骤和常规步骤,并从网上也收集到了一 ...
- 【学习笔记】编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译
本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录,就可以发现源码目录及其子目录中有很多的KConfig文件和Makefile文件.这些文件什么作用呢?正是这些文件组成了Linux ...
- 编译arm linux内核,编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译...
转载自:http://blog.csdn.net/newthinker_wei/article/details/8022696 本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录, ...
- 无法添加内核模式驱动的打印机
症状描述 添加共享打印机时出现错误提示:"当前打印机驱动程序与计算机上启用的某个策略不兼容",导致无法添加成功. 原因分析 因为内核模式可以访问系统底层的内存,因此写得不好的内核模 ...
- Arm开发板内核驱动模块--Helloworld及Makefile
1. 在/home/sxy/目录下新建hello_1文件夹,在此文件夹下编写hello.c和Makefile文件(假设已经编写好了),make生成模块文件: PS:hello.ko就是用于需要使用的驱 ...
- Linux内核驱动模块示例--Helloword及Makefile
先看一个最简单的驱动程序: //hello.c #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE ...
最新文章
- 计算机基础办公软件应用技能,计算机一级计算机基础及 ms office 应用考些什么...
- 第二十五章 面向对象------封装、内置函数、反射、动态导入
- git管理大项目或者大文件
- ORACLE安装参数修改
- 如何利用阿里云安全产品加强你的网站防护能力
- QT 5.9.8在ubuntu16.04下安装配置
- boost::bad_function_call用法的测试程序
- 【云上创新】阿里云视频云分享全场景音视频服务背后的场景探索与技术实践
- [模板]洛谷T3379 最近公共祖先(LCA) 倍增+邻接表
- python3-numpy np.nditer 迭代数组、np.nditer修改数组、np.nditer广播迭代
- 第5章 编写主引导扇区代码
- Halcon基本例程(二)
- 第一型曲面积分的总结思考
- FusionChart样例
- Linux安装PHP环境LNMP
- PHP array(递归)转xml,xml转array
- ArcGIS Pro2.5安装步骤(含Pro2.5安装包)
- 在微信收藏笔记中的录音文件拷贝或另存问题--适用于silk无法导出,看不见的情况
- 读取raw格式数据,OpenCV显示
- 在win10中安装caffe并配置MATLAB和Python接口(支持GPU加速)