Linux内核中的GPIO系统之(3):pin controller driver代码分析

作者:linuxer 发布于:2014-7-22 20:37 分类:GPIO子系统

对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道,pin control subsystem也不例外,它驱动的硬件叫做pin controller(一般ARM soc的datasheet会把pin controller的内容放入GPIO controller的章节中),主要功能包括:

(1)pin multiplexing。基于ARM core的嵌入式处理器一般会提供丰富的功能,例如camera interface、LCD interface、USB、I2C、SPI等等。虽然处理器有几百个pin,但是这些pin还是不够分配,因此有些pin需要复用。例如:127号 GPIO可以做一个普通的GPIO控制LED,也可以配置成I2C的clock信号,也可以配置成SPI的data out信号。当然,这些功能不可能同时存在,因为硬件信号只有一个。

(2)pin configuration。这些配置参数包括:pull-up/down电阻的设定, tri-state设定,drive-strength的设定。

本 文主要描述pin control subsystem中的low level driver,也就是驱动pin controller的driver。具体的硬件选用的是S3C2416的硬件平台。既然是代码分析,本文不是非常多的描述框架性的内容,关于整个pin control subsystem软件结构的描述请参考TODO。

阅读本文需要device tree的知识,建议首先阅读device tree代码分析

阅读全文>>

标签: driver pin controller

评论(51) 浏览(105362)

linux内核中的GPIO系统之(1):软件框架

作者:linuxer 发布于:2014-7-21 14:40 分类:GPIO子系统

作为一个工作多年的系统工程师,免不了做两件事情:培训新员工和给新员工分配任务。对于那些刚刚从学校出来的学生,一般在开始的时候总是分配一些非 常简单的任务,例如GPIO driver、LED driver。往往CPU datasheet的关于GPIO或者IO ports的章节都是比较简单的,非常适合刚入行的工程师。虽然GPIO子系统相关的硬件比较简单,没有复杂的协议,不过,对于软件抽象而言,其分层次的 软件思想是每个嵌入式软件工程师需要掌握的内容。

我更倾向使用GPIO系统这个名字来代替GPIO driver这个名字,GPIO driver仅仅包含了pin signal状态控制和读取的内容,而GPIO系统包括了pin multiplexing、pin configuration、GPIO control、GPIO interrupt control等内容。本文主要是以3.14内核作为例子,讲述linux kernel中GPIO系统的软件框架。

阅读全文>>

标签: GPIO 软件框架

评论(49) 浏览(84988)

ACCESS_ONCE宏定义的解释

作者:linuxer 发布于:2014-7-17 12:34 分类:进程管理

在阅读RCU代码的时候遇到了ACCESS_ONCE这个宏定义,感觉比较有意思,因此独立出来一篇文档来描述它。

阅读全文>>

标签: ACCESS_ONCE

评论(0) 浏览(20506)

GIC驱动代码分析(废弃)

作者:linuxer 发布于:2014-7-4 14:34 分类:中断子系统

GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器。GIC通过AMBA(Advanced Microcontroller Bus Architecture)这样的片上总线连接到一个或者多个ARM processor上。本文主要分析了linux kernel中GIC中断控制器的驱动代码。

具体的分析方法是按照source code为索引,逐段分析。对于每一段分析的代码,力求做到每个细节都清清楚楚。这不可避免要引入很多对GIC的硬件描述,此外,具体GIC中断控制器的 驱动代码和linux kernel中断子系统的交互也会描述,但本文不会描述linux kernel的generic interrupt subsystem。

本文以OMAP4460这款SOC为例,OMAP4460内部集成了GIC的功能。具体的linux kernel的版本是linux3.14.。

阅读全文>>

标签: GIC 代码分析

评论(19) 浏览(46304)

Linux电源管理(5)_Hibernate和Sleep功能介绍

作者:wowo 发布于:2014-6-10 16:11 分类:电源管理子系统

Hibernate和Sleep两个功能是Linux Generic PM的核心功能,它们的目的是类似的:暂停使用——>保存上下文——>关闭系统以节电········>恢复系统——>恢复上下文——>继续使用。

本文以内核向用户空间提供的接口为突破口,从整体上对这两个功能进行介绍,并会在后续的文章中,分析它们的实现逻辑和执行动作。

顺便感概一下,虽然这些机制在Linux系统中存在很久了(类似的概念也存在于Windows系统中),但以蜗蜗的观察,它们被使用的频率并不是很高,特别是在PC上,大多数人在大多数时候选择直接关闭系统。阴错阳差的是,在很多嵌入式设备中,设计者会利用Sleep机制实现热关机功能,以此减少开机的时间。

阅读全文>>

标签: Linux PM STD STR wakeup_count

评论(43) 浏览(60265)

Device Tree(三):代码分析

作者:linuxer 发布于:2014-6-6 16:03 分类:统一设备模型

Device Tree总共有三篇,分别是:

1、为何要引入Device Tree,这个机制是用来解决什么问题的?(请参考引入Device Tree的原因

2、Device Tree的基础概念(请参考DT基础概念

3、ARM linux中和Device Tree相关的代码分析(这是本文的主题)

本文主要内容是:以Device Tree相关的数据流分析为索引,对ARM linux kernel的代码进行解析。主要的数据流包括:

1、初始化流程。也就是扫描dtb并将其转换成Device Tree Structure。

2、传递运行时参数传递以及platform的识别流程分析

3、如何将Device Tree Structure并入linux kernel的设备驱动模型。

注:本文中的linux kernel使用的是3.14版本。

阅读全文>>

标签: 设备树

评论(162) 浏览(154636)

Device Tree(二):基本概念

作者:linuxer 发布于:2014-5-30 16:47 分类:统一设备模型

一些背景知识(例如:为何要引入Device Tree,这个机制是用来解决什么问题的)请参考引入Device Tree的原因,本文主要是介绍Device Tree的基础概念。

简 单的说,如果要使用Device Tree,首先用户要了解自己的硬件配置和系统运行参数,并把这些信息组织成Device Tree source file。通过DTC(Device Tree Compiler),可以将这些适合人类阅读的Device Tree source file变成适合机器处理的Device Tree binary file(有一个更好听的名字,DTB,device tree blob)。在系统启动的时候,boot program(例如:firmware、bootloader)可以将保存在flash中的DTB copy到内存(当然也可以通过其他方式,例如可以通过bootloader的交互式命令加载DTB,或者firmware可以探测到device的信 息,组织成DTB保存在内存中),并把DTB的起始地址传递给client program(例如OS kernel,bootloader或者其他特殊功能的程序)。对于计算机系统(computer system),一般是firmware->bootloader->OS,对于嵌入式系统,一般是bootloader->OS。

本文主要描述下面两个主题:

1、Device Tree source file语法介绍

2、Device Tree binaryfile格式介绍

阅读全文>>

标签: Device tree

评论(162) 浏览(209416)

Linux电源管理(4)_Power Management Interface

作者:wowo 发布于:2014-5-29 15:55 分类:电源管理子系统

Linux电源管理中,相当多的部分是在处理Hibernate、Suspend、Runtime PM等功能。而这些功能都基于一套相似的逻辑,即“Power management interface”。该Interface的代码实现于“include/linux/pm.h”、“drivers/base/power/main.c”等文件中。主要功能是:对下,定义Device PM相关的回调函数,让各个Driver实现;对上,实现统一的PM操作函数,供PM核心逻辑调用。

因此在对Hibernate、Suspend、Runtime PM等功能解析之前,有必要先熟悉一下PM Interface,这就是本文的主要目的。

阅读全文>>

标签: Linux PM 电源管理 dev_pm_ops dpm

评论(18) 浏览(55170)

Device Tree(一):背景介绍

作者:linuxer 发布于:2014-5-22 16:46 分类:统一设备模型

作为一个多年耕耘在linux 2.6.23内核的开发者,各个不同项目中各种不同周边外设驱动的开发以及各种琐碎的、扯皮的俗务占据了大部分的时间。当有机会下载3.14的内核并准备 学习的时候,突然发现linux kernel对于我似乎变得非常的陌生了,各种新的机制,各种framework、各种新的概念让我感到阅读内核代码变得举步维艰。 还好,剖析内核的热情还在,剩下的就交给时间的。首先进入视线的是Device Tree机制,这是和porting内核非常相关的机制,如果想让将我们的硬件平台迁移到高版本的内核上,Device Tree是一个必须要扫清的障碍。

我想从下面三个方面来了解Device Tree:

1、为何要引入Device Tree,这个机制是用来解决什么问题的?(这是本文的主题)

2、Device Tree的基础概念(请参考DT基础概念

3、ARM linux中和Device Tree相关的代码分析(请参考DT代码分析

阅 读linux内核代码就像欣赏冰山,有看得到的美景(各种内核机制及其代码),也有埋在水面之下看不到的基础(机制背后的源由和目的)。沉醉于各种内核机 制的代码固然有无限乐趣,但更重要的是注入更多的思考,思考其背后的机理,真正理解软件抽象。这样才能举一反三,并应用在具体的工作和生活中。

本文主要从下面几个方面阐述为何ARM linux会引入Device Tree:

1、没有Device Tree的ARM linux是如何运转的?

2、混乱的ARM architecture代码和存在的问题

3、新内核的解决之道

阅读全文>>

标签: Device tree

评论(64) 浏览(159358)

Linux电源管理(3)_Generic PM之Reboot过程

作者:wowo 发布于:2014-5-19 15:44 分类:电源管理子系统

在使用计算机的过程中,关机和重启是最先学会的两个操作。同样,这两个操作在Linux中也存在,称作shutdown和restart。这就是本文要描述的对象。

在Linux Kernel中,主流的shutdown和restart都是通过“reboot”系统调用(具体可参考kernel/sys.c)来实现的,这也是本文使用“Generic PM之Reboot过程”作为标题的原因。另外,除了我们常用的shutdown和restart两类操作之外,该系统调用也提供了其它的reboot方式,也会在这里一一说明。

阅读全文>>

标签: Linux PM 电源管理 reboot power_off

评论(37) 浏览(71998)

Copyright @ 2013-2015 蜗窝科技 All rights reserved. Powered by emlog