linux 中断子系统

###1. linux 中断子系统 在一个完整的系统中, 将与中断相关的硬件划分为3类: 设备 设备是发起中断的源,当设备需要请求某种服务的时候,它会发起一个硬件中断信号,通常,该信号会连接至中断控制器,由中断控制器做进一步的处理。在现代的移动设备中,发起中断的设备可以位于soc(system-on-chip)芯片的外部,也可以位于soc的内部,因为目前大多数soc都集成了大量的硬件IP,例如I2C、SPI、Display Controller等等。 中断控制器 中断控制器负责收集所有中断源发起的中断,现有的中断控制器几乎都是可编程的,通过对中断控制器的编程,我们可以控制每个中断源的优先级、中断的电器类型,还可以打开和关闭某一个中断源,在smp系统中,甚至可以控制某个中断源发往哪一个CPU进行处理。对于ARM架构的soc,使用较多的中断控制器是VIC(Vector Interrupt Controller),进入多核时代以后,GIC(General Interrupt Controller)的应用也开始逐渐变多。 cpu cpu是最终响应中断的部件,它通过对可编程中断控制器的编程操作,控制和管理者系统中的每个中断,当中断控制器最终判定一个中断可以被处理时,他会根据事先的设定,通知其中一个或者是某几个cpu对该中断进行处理,虽然中断控制器可以同时通知数个cpu对某一个中断进行处理,实际上,最后只会有一个cpu相应这个中断请求,但具体是哪个cpu进行响应是可能是随机的,中断控制器在硬件上对这一特性进行了保证,不过这也依赖于操作系统对中断系统的软件实现。在smp系统中,cpu之间也通过IPI(inter processor interrupt)中断进行通信。 ###2. irq 在系统中注册的每一个中断源, 都会分配一个唯一的编号来标识该中断, 称之为 irq 号, 在驱动中, 调用和 irq 相关的 api 时, 都需要使用 irq 号来指定 中断源。 中断发生时,cpu通常会从中断控制器中获取相关信息,然后计算出相应的 IRQ 编号,然后把该 IRQ 编号传递到相应的驱动程序中。在移动设备中,每个中断源的...

linux regulator

###1. linux regulator linux regulator框架是为了提供一套标准的接口来控制电压调节器和电流调节器, 这样系统可以动态控制调节器的功率输出达到省电和延长电池寿命的能力, 它能够应用在电压调节器(针对输出电压可控制的调节器)和电流调节器(针对输出电流上限可控制的调节器)。 ###2. 相关的概念 在讲解regulator之前, 先来了解一些相关的概念 ####2.1 regulator 为其它设备供电的电子设备, 大部分的regulator能够 使能/关闭 输出,有一些regulator还能够控制输出电压和输出电流 ####2.2 PMIC 电源管理IC, 通常包含数个regulator, 还可能包含其它一些功能模块。 ####2.3 consumer 被regulator供电的电子设备, consumer可被分为两类: 固定供电: 这一类consumer不要求改变其供电电压或者供电电流, 只要求能够 使能/关闭 对其供电 。 动态供电: 这一类consumer要求能够改变其供电电压或者供电电流以适应其操作需求。 ####2.4 power Domain 电路中被统同一个regulator, switch, 或power...

linux console

###1. linux 控制台 在linux中存在着多种类型的终端, 如tty, pty, console ###2.串行端口终端(/dev/ttySn) 串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0), /dev/tts/1(或/dev/ttyS1)等,设备号分别是(4,0), (4,1)等,分别对应于DOS系统下的COM1、COM2等。若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如,在命令行提示符下键入: echo test > /dev/ttyS1 会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。可接串口来实验。 ###3.伪终端(/dev/pty/) 伪终端(Pseudo Terminal)是成对的逻辑终端设备(即master和slave设备, 对master的操作会反映到slave上)。 例如/dev/ptyp3和/dev/ttyp3(或者在设备文件系统中分别是/dev/pty/m3和 /dev/pty/s3)。它们与实际物理设备并不直接相关。如果一个程序把ptyp3(master设备)看作是一个串行端口设备,则它对该端口的读/ 写操作会反映在该逻辑终端设备对应的另一个ttyp3(slave设备)上面。而ttyp3则是另一个程序用于读写操作的逻辑设备。 这样,两个程序就可以通过这种逻辑设备进行互相交流,而其中一个使用ttyp3的程序则认为自己正在与一个串行端口进行通信。这很象是逻辑设备对之间的管道操作。对于ttyp3(s3),任何设计成使用一个串行端口设备的程序都可以使用该逻辑设备。但对于使用ptyp3的程序,则需要专门设计来使用 ptyp3(m3)逻辑设备。 例如,如果某人在网上使用telnet程序连接到你的计算机上,则telnet程序就可能会开始连接到设备 ptyp2(m2)上(一个伪终端端口上)。此时一个getty程序就应该运行在对应的ttyp2(s2)端口上。当telnet从远端获取了一个字符时,该字符就会通过m2、s2传递给 getty程序,而getty程序就会通过s2、m2和telnet程序往网络上返回”login:”字符串信息。这样,登录程序与telnet程序就通过“伪终端”进行通信。通过使用适当的软件,就可以把两个甚至多个伪终端设备连接到同一个物理串行端口上。 在使用设备文件系统 (device filesystem)之前,为了得到大量的伪终端设备特殊文件,使用了比较复杂的文件名命名方式。因为只存在16个ttyp(ttyp0—ttypf) 的设备文件,为了得到更多的逻辑设备对,就使用了象q、r、s等字符来代替p。例如,ttys8和ptys8就是一个伪终端设备对。不过这种命名方式目前仍然在RedHat等Linux系统中使用着。 但Linux系统上的Unix98并不使用上述方法,而使用了”pty master”方式,例如/dev/ptm3。它的对应端则会被自动地创建成/dev/pts/3。这样就可以在需要时提供一个pty伪终端。目录 /dev/pts是一个类型为devpts的文件系统,并且可以在被加载文件系统列表中看到。虽然“文件”/dev/pts/3看上去是设备文件系统中的一项,但其实它完全是一种不同的文件系统。 即: TELNET —>...

linux内核模块

###1. linux内核模块 linux支持将内核功能, 单独编译为内核模块( *.ko 文件), 在系统运行期间动态加载进内核执行, 大大提高了灵活性(例如, 可以将driver编译为内核模块, 在需要时才加载进内核, 不需要时则不记载,不占用内存) ###2. 内核模块模板 #include <linux/module.h> #include <linux/init.h> #include <linux/stat.h> #include <linux/kprobes.h> /* module macros */ MODULE_LICENSE("GPL"); MODULE_AUTHOR("xxx@xxxx.com"); MODULE_DESCRIPTION("module description"); /* module constructor */ static int __init my_init(void) { pr_info("test1: enter...

svc 命令

###1. svc命令 svc命令,位置在/system/bin目录下,用来管理电源控制,无线数据,WIFI ###2. svc power ####2.1 设置屏幕在某种条件下常亮 svc power stayon [true|false|usb|ac|wireless] ####2.2 设备重启 svc power reboot [reason] ####2.3 设备关机 svc power shutdown ###3. svc data ####3.1 打开/关闭移动数据 svc data [enable|disable] ####3.2 设置移动数据优先于wifi svc data prefer ###4. svc wifi ####4.1...