SPI驱动调试感悟
最近一段时间,在TX1平台的uboot中添加一个spi接口的液晶显示屏的驱动。本来以为是一项简单的工作,因为:
1、相同的驱动在其他平台的uboot中已经添加过了
2、内核中的驱动也是验证可用的,所以硬件上也是没有问题。
但实际进行下来,却花了一个月的时间,因此有些感悟,除了抱怨“巨坑”的Nvidia软件水平之外:
1、Device Tree是一个好东西,可以让人高效、优雅的“配置”驱动。
2、第一条成立的条件是,驱动是正确完备的,Device Tree本身并不能帮助解决驱动中的BUG,某些时候反而是一些阻碍。
3、驱动,从本质上讲,就是配置一些硬件寄存器,比上层应用简单得多。
4、嵌入式软件工程师要勇于对照数据手册,独立的实现设备驱动。
吐槽一下问题的原因,uboot中spi2的驱动不能正常工作的原因是电源管理相关的寄存器没有配置,但是数据手册里面没有这方面的说明,问了技术支持也表示不清楚。内核里能给运行的驱动里也没有这方面的配置,所以无法参考。
最后解决问题的方法是,在内核里写一个最简单版本的初始化spi的驱动(只有一个函数,只读写寄存器),不涉及任何dts、driver platform。然后把这个驱动沿着start_kernel函数的内核启动顺序放置,看看在哪些点能正常运行,哪些时间点能够重现uboot的现象,从而找出在此期间内核代码所做的哪一步操作影响了spi2的运行。
SPI驱动调试感悟的更多相关文章
- 基于TQ2440的SPI驱动学习(OLED)
平台简介 开发板:TQ2440 (NandFlash:256M 内存:64M) u-boot版本:u-boot-2015.04 内核版本:Linux-3.14 作者:彭东林 邮箱:pengdongl ...
- SPI 驱动分析
断更博客两个月后我又回来了,眯着躺倒就能睡熟的小眼睛,在这儿敲键盘.这篇文章给你快乐,你有没有爱上我! SPI驱动由三部分组成,分别为drivers.core.device.通过bus总线连接.困了不 ...
- Android驱动调试利器Busybox之初体验
工欲善其事必先利其器,之前做WinCE开发时,经常写一些小工具以提高开发调试的效率,如WinCE驱动调试助手.WinCE串口调试助手.WinCE6.0寄存器访问工具.WinCE远程桌面助手和S3C24 ...
- [windows驱动]windows8.1驱动调试前戏
人们都说在干正事之前,得先做足前戏才会爽,我一直很认同这个观点,下面我来总结下进行windows8.1的WDK调试所要做的准备工作. 软件安装: 1.VS2013. 2.WDK8.1 3.Window ...
- Linux驱动设计—— 驱动调试技术
参考博客与书籍: <Linux设备驱动开发详解> <Linux设备驱动程序> http://blog.chinaunix.net/uid-24219701-id-2884942 ...
- android 电容屏(二):驱动调试之基本概念篇
平台信息: 内核:linux3.4.39系统:android4.4 平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新浪博 ...
- 【转】android 电容屏(三):驱动调试之驱动程序分析篇
关键词:android 电容屏 tp 工作队列 中断 坐点计算 电容屏主要参数平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV310( ...
- 【转】android 电容屏(二):驱动调试之基本概念篇
关键词:android 电容屏 tp 工作队列 中断 多点触摸协议平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV310(samsung ...
- 【转】Android LCD(四):LCD驱动调试篇
关键词:android LCD TFTSN75LVDS83B TTL-LVDS LCD电压背光电压 平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台 ...
随机推荐
- zabbix监控mysql性能
使用zabbix监控mysql的三种方式 1.只是安装agent 2.启用模板监控 3.启用自定义脚本的模板监控 zabbix中默认有mysql的监控模板.默认已经在zabbix2.2及以上的版本中. ...
- java线程interrupt、interrupted 、isInterrupted区别
前言 在分析interrupt之前,应该先了解java里线程有5种状态,其中有一个阻塞状态,interrupt和阻塞有关. interrupt() 方法 作用于要中断的那个线程. interrupt( ...
- 如何用Redis做LRU-Cache
LRU(Least Recently Used)最近最少使用算法是众多置换算法中的一种. Redis中有一个maxmemory概念,主要是为了将使用的内存限定在一个固定的大小.Redis用到的LRU ...
- 关于js中循环遍历中顺序执行多个嵌套ajax的问题
就是业务上需要完成一个功能,这个功能需要依次调用四个接口,后面接口的参数都依赖于前一个接口的返回值. 类似这样: var objArr = "从其他逻辑获得"; for(var n ...
- Composer基本安装步骤
Composer是 PHP 世界里用于管理项目依赖的工具. 1,确保安装PHP,检查方法命令行窗口执行php -v,查看是否正常输出版本 php -v 2,下载安装脚本composer-setup.p ...
- tkinter中布局pack、place和grid(八)
tkinter中布局pack.place和grid pack布局 import tkinter wuya = tkinter.Tk() wuya.title("wuya") wuy ...
- Python中使用MongoEngine2
mongoengine基本用法实例: from mongoengine import * from datetime import datetime #连接数据库:test # connect('te ...
- ubuntu 16.04启用root用户方法
1.使用:sudo passwd root设置root的密码,如下图所示: 2.使用su root来测试是否可以进入root用户,如果出现#说明已经设置root用户的密码成功,如下图所示:
- 随手一记,maven打包
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-depen ...
- Swift 结构体的使用
Swift 结构体是构建代码所用的一种通用且灵活的构造体. 我们可以为结构体定义属性(常量.变量)和添加方法,从而扩展结构体的功能. 与 C 和 Objective C 不同的是: 结构体不需要包含实 ...