ramoops具体失败原因来解释驱动寄存器
正在使用linux的ramoops驱动器模块,当编译完成加载。查找驱动程序加载失败。显然,直接用内核代码,为什么会出现这种情况?
第一眼ramoops初始化代码:
180 static int __init ramoops_init(void)
181 {
182 return platform_driver_probe(&ramoops_driver, ramoops_probe);
183 }
184
185 static void __exit ramoops_exit(void)
186 {
187 platform_driver_unregister(&ramoops_driver);
188 }
189
190 module_init(ramoops_init);
180行開始的ramoops_init函数是不是有点奇怪?直接就调用了probe函数。标准的platform驱动程序的流程是这种:
怎么看起来好像缺少platform_device的定义和注冊。究竟是不是由于这个呢?我们来看一下Document/ramoops.txt的相关说明:
38 2. Setting the parameters
39
40 Setting the ramoops parameters can be done in 2 different manners:
41 1. Use the module parameters (which have the names of the variables described
42 as before).
43 For quick debugging, you can also reserve parts of memory during boot
44 and then use the reserved memory for ramoops. For example, assuming a machine
45 with > 128 MB of memory, the following kernel command line will tell the
46 kernel to use only the first 128 MB of memory, and place ECC-protected ramoops
47 region at 128 MB boundary:
48 "mem=128M ramoops.mem_address=0x8000000 ramoops.ecc=1"
49 2. Use a platform device and set the platform data. The parameters can then
50 be set through that platform data. An example of doing that is:
51
52 #include <linux/pstore_ram.h>
53 [...]
54
55 static struct ramoops_platform_data ramoops_data = {
56 .mem_size = <...>,
57 .mem_address = <...>,
58 .record_size = <...>,
59 .dump_oops = <...>,
60 .ecc = <...>,
61 };
62
63 static struct platform_device ramoops_dev = {
64 .name = "ramoops",
65 .dev = {
66 .platform_data = &ramoops_data,
67 },
68 };
69
70 [... inside a function ...]
71 int ret;
72
73 ret = platform_device_register(&ramoops_dev);
74 if (ret) {
75 printk(KERN_ERR "unable to register platform device\n");
76 return ret;
77 }
原来真的是由于少了platform_device的缘故,赶紧加上。
追加platform_device的操作比較简单,依照Document上的来就能够了。
有一点须要主要。就是ramoops_dev的name这个成员。这个成员的值必须是"ramoops"。为什么呢?这是由于platform总线在调用自身的match函数,将driver与device进行匹配时,就是推断两个结构体中的name成员是否相等。
而platform_driver结构体中的name成员的值,从以下的代码中能够看出,已经写定为"ramoops"。假设platform_device中的值不同,则驱动相同无法载入。
172 static struct platform_driver ramoops_driver = {
173 .remove = __exit_p(ramoops_remove),
174 .driver = {
175 .name = "ramoops",
176 .owner = THIS_MODULE,
177 },
178 };
有没有想过,为什么没注冊platform_device,ramoops的驱动代码就不能载入呢?再回过头来看一下ramoops的初始化代码:
180 static int __init ramoops_init(void)
181 {
182 return platform_driver_probe(&ramoops_driver, ramoops_probe);
183 }
之前说过,一般init函数中会调用register函数,还说这是标准流程了呢。看一下platform_driver_probe函数的定义:
477 int __init_or_module platform_driver_probe(struct platform_driver *drv,
478 int (*probe)(struct platform_device *))
479 {
480 int retval, code;
481
482 /* make sure driver won't have bind/unbind attributes */
483 drv->driver.suppress_bind_attrs = true;
484
485 /* temporary section violation during probe() */
486 drv->probe = probe;
487 retval = code = platform_driver_register(drv);
488
。 。 。 }
看到platform_driver_register函数没?原来是将register函数封装了一层。
看到这里应该明确了,为什么没有注冊platform_device。驱动会载入失败了吧。
什么,还是不知道?那你一定没看我之前写的关于linux设备驱动程序的注冊流程。假设看完了还没明确,那就是我的问题。链接在此:http://blog.csdn.net/tuzhutuzhu/article/details/34847619
版权声明:本文博主原创文章,博客,未经同意不得转载。
ramoops具体失败原因来解释驱动寄存器的更多相关文章
- tomcat下服务启动失败原因
Tomcat启动成功,输入网址后可以显示小黄猫界面,但是在Tomcat下的服务却启动不成功,显示404(以Jenkins为例,运用多种方式查看原因) 注:1.单启动Tomcat服务是可以启动成功的. ...
- Tomcat启动失败原因
Tomcat启动失败原因 一.Tomcat启动时,要求被加载的项目必须拥有独立路径名称 发布的两个工程具有相同路径名称,这是不允许. 二.8080端口号已经被占用了 启动失败原因,就是8085端口上, ...
- 玩转Windows服务系列——无COM接口Windows服务启动失败原因及解决方案
将VS创建的Windows服务项目编译生成的程序,通过命令行 “服务.exe -Service”注册为Windows服务后,就可以通过服务管理器进行管理了. 问题 通过服务管理器进行启动的时候,发现服 ...
- pip install 提示代理连接失败原因及解决办法
# pip install 提示代理连接失败原因及解决办法 1. 错误提示 在公司电脑上安装Python的虚拟环境时输入命令: pip install virtualenv 系统提示以下异常信息: R ...
- 单点登录跳转失败(原因是 主票据申请子票据失败) asp.net 同站点下不同应用间不同版本Framework问题
单点登录跳转失败(原因是 主票据申请子票据失败) asp.net 同站点下不同应用间不同版本Framework问题 今天遇到一个问题,在主站点现在配置的应用和主站点登录会话状态不能共享,进入子站点应用 ...
- mysql创建唯一索引UNIQUE INDEX,以及报错“#失败原因: [Execute: Duplicate entry '733186700' for key 'uniq_video_id_index']”
要给t_video_prods表的video_id字段创建唯一所以,可以使用下面这条语句: alter table t_video_prods add UNIQUE INDEX `uniq_video ...
- 【HANA系列】SAP ECLIPSE中创建ABAP项目失败原因解析
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP ECLIPSE中创建AB ...
- Linux嵌入式学习-mount命令+nfs挂载失败原因【转】
NFS 挂载失败原因[待搜集] 1.挂载时若出现mount.nfs: Input/output error 解决:在客户端也需启动portmap服务 service portmap status[查看 ...
- dpdk组态 千兆网卡 驱动 失败 原因分析及 解决方案
dpdk版本号是1.7.1稳定版,server它是ubuntu12.04LTS x86 64bit 绑定默认驱动程序千兆网卡ixgbe失败 # ./dpdk_nic_bind.py -b ixgbe ...
随机推荐
- cocos2d-x 消类游戏,类似Diamond dash 设计
前几天刚刚在学习cocos2d-x,无聊之下自己做了一个类似Diamond dash的消类游戏,今天放到网上来和大家分享一下.我相信Diamond dash这个游戏大家都玩过,游戏的规则是这样的,有一 ...
- 《Java并发编程实战》第七章 取消与关闭 读书笔记
Java没有提供不论什么机制来安全地(抢占式方法)终止线程,尽管Thread.stop和suspend等方法提供了这种机制,可是因为存在着一些严重的缺陷,因此应该避免使用. 但它提供了中断In ...
- cowboy rest
REST Flowcharts 这章节将通过一些列不同的流程图来介绍REST处理状态机. 一个请求主要有四条路线,一个是方法OPTIONS. 一个是方法GET和HEAD.一个是PUT.POST和PAT ...
- Knockout应用开发指南 第五章:创建自定义绑定
原文:Knockout应用开发指南 第五章:创建自定义绑定 创建自定义绑定 你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等).你可以你封装复杂的逻辑或行为,自定 ...
- windows phone 7,sliverlight 下载网页的解析,关于wp7 gb2312编码
原文:windows phone 7,sliverlight 下载网页的解析,关于wp7 gb2312编码 关于silverlight和wp7(windows phone 7)是默认不支持gb2312 ...
- 关于安装linux时要怎么分区的考虑的參考方式?
对于使用最小化安装的centos7文件夹列表,注意链接方式的文件夹会在统计占用空间时不会算入的; watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWlkaX ...
- SplitContainer如何实现左侧导航,正确显示和导航内容
关于这种类型的设计有很多的实现,这样,我首先解释一下我使用: 我的原则是实现方式,将form嵌panel在,作为一个子窗口. 如下面的代码细节: Form form = new DataSelect( ...
- 关于AIX lv 4k offset问题初步了解
关于这个问题我们首先来看一下AIX的vg的3种类型: original vg 普通卷组 big vg 大卷组 scalable vg 动态的或者可扩展的卷组 如何快速区分这三组卷组呢? 通过其参数MA ...
- Eclipse+Maven命令创建webapp项目<三>
1.使用maven命令:mvn archetype:create -DgroupId=xxxxx -DartifactId=web-sample -DarchetypeArtifactId=maven ...
- 3D MAX脚本教程1
本文转载自http://jiurong995294.blog.163.com/blog/static/195133243201192531546490/ 方便以后须要时候使用 为什么要学习3D MAX ...