- 博客(98)
- 资源 (2)
- 收藏
- 关注
转载 Linux DMA
Dynamic DMA mapping Guide ========================= David S. Miller Richard Henderson Jakub Jelinek This is a guide to device driver writers on how to use the DMA APIwith exampl
2017-05-24 16:28:30 1080
原创 高通SDHCI(SDC)接口,SD卡初始化,检测等
sdhc_2: sdhci@7864900 { compatible = "qcom,sdhci-msm"; reg = <0x7864900 0x11c>, <0x7864000 0x800>; reg-names = "hc_mem", "core_mem"; interrupts = <0 125 0>, <0 221 0>;
2017-03-01 17:15:25 8006
原创 STM32F10x DMA介绍以及 dma usart数据收发
DMA方式1. DMA 介绍 Direct memory access (DMA) is used in order to provide high-speed data transfer between peripherals and memory and between memory and memory. Data can be quickly moved by DMA withou
2017-02-22 23:42:24 1959
原创 STM32F10x usart数据收发
STM32F10x uart的数据发送接收就三种基本方式,轮询、中断和DMA1. 轮询(polling)方式以下是轮询的uart初始化以及发送接收的例子,发送和接收都用轮询的方式。uint8_t TxBuffer[] = "Buffer Send from USARTy to USARTz using Flags";uint8_t RxBuffer[TxBufferSize];int main
2017-02-22 23:41:53 1837
原创 STM32F10x uart连接端口以及功能描述
USART功能描述USART双向通信至少需要两个管脚:Receive Data In(RX) and Transmit Data Out(Tx)。 如果是同步模式(synchronous mode)的话,需要SCLK pin。 SCLK pin:Transmitter clock output. This pin outputs the transmitter data clock for
2017-02-22 23:40:52 2226
原创 STM32F10x uart初始化以及寄存器说明
USART(Universal Synchronous Asynchronous Receiver Transmitter) 也就是通用同步异步收发。它根据NRZ非同步串行数据工业标准,提供了灵活的全双工数据交换功能。它支持同步单向通信和半双工单线通信,也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及硬件控制操作(需要增加两个管脚,分别是CTS/RTS)。
2017-02-22 23:40:05 5698
原创 Linux内核驱动:ion memory
高通msm平台为例,以下是这个平台定义的几个ion内存。 qcom,ion { compatible = "qcom,msm-ion"; #address-cells = <1>; #size-cells = <0>; qcom,ion-heap@25 { reg = <25>; qc
2017-02-22 23:32:21 2995
原创 Linux 中断(irq)控制器以及device tree设置
GPIO相关中断(高通平台为例)gpio相关的中断控制器(msm_tlmm_irq) 初始化(1) IRQCHIP_DECLARE定义irq chip#define IRQCHIP_DECLARE(name,compstr,fn) \ static const struct of_device_id irqchip_of_match_##name \
2017-02-22 23:30:06 1183
原创 Linux驱动基础:msm平台,modem等framework加载
msm平台,AP和CP封装在一起,公用一块内存。所以AP需要负责把整个modem, TZ , rpm等binary拷贝到内存中以供modem等subsystem去运行。那AP这边是怎么分配这些内存,又是怎么读出来相关的binary,又如何把binary上传上去的呢??相关的featureCONFIG_FW_LOADERCONFIG_FW_LOADER_USER_HELPERmodem使用的内存申
2017-02-22 23:29:24 1554
原创 Linux中断(interrupt)子系统
中断系统基本原理这个中断系列文章主要针对移动设备中的Linux进行讨论,文中的例子基本都是基于ARM这一体系架构,其他架构的原理其实也差不多,区别只是其中的硬件抽象层。内核版本基于3.3。虽然内核的版本不断地提升,不过自从上一次变更到当前的通用中断子系统后,大的框架性的东西并没有太大的改变。1. 设备、中断控制器和CPU一个完整的设备中,与中断相关的硬件可以划分为3类,它们分别是:设备、中断控制器
2017-02-22 23:27:55 4935
原创 Linux ALSA声卡驱动
概述ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构,想了解更多的关于ALSA的这一开源项目的信息和知识,请查看以下网址:http://www.alsa-project.org/。在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为我们提供了alsa-lib,应用程序只要调用alsa-lib提
2017-02-22 23:27:09 9787
原创 Linux驱动基础:MSM平台AP/CP通信机制
概述MSM平台AP和CP封装到一个芯片,共享内容。所以之前也说过,高通的MSM解决方案中,CP的代码都是由AP放到指定地址的内存中以供CP运行。那上传完代码,CP开始跑之后,AP/CP之间的通信又是怎么弄的呢? 其实也是在内存中开辟一段共享内存进行通信的。高通文档中有介绍以下三种。SMD : Shared Memory DriverSMEM : Shared Memory ManagerS
2017-02-22 23:25:59 2089
原创 MSM平台RPM
Software Component Block DiagramRPM(Resource Power Manager)是高通MSM平台另外加的一块芯片,虽然与AP芯片打包在一起,但其是一个独立的ARM Core。之所以加这个东西,就是要控制整个电源相关的shared resources,比如ldo,clock。负责与SMP,MPM交互进入睡眠或者唤醒整个系统。 以下是高通文档中对各个功能模块的说明
2017-02-22 23:24:54 4753
原创 Linux:进程间通信
一般的Linux进程间通信的方法:pipesocketshared memoryFIFOMessage QueueSemaphoresShared MemoryAndroid另外还有Binder等,也是用的shared memory机制。这有专门的说明,这里就不多说了。pipepipe只能用于有同一个父进程的进程之间,或者在父进程和子进程之间进行通信。#include <unistd
2017-02-22 23:23:21 604
原创 Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
我们知道,SPI数据传输可以有两种方式:同步方式和异步方式。所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返回。而异步方式则正好相反,数据传输的发起者无需等待传输的结束,数据传输期间还可以做其它事情,用代码来解释就是,调用传输的函数后,函数会立刻返回而不用等待数据传输完成,我们只需设置一个回调函数,传输完成后
2017-02-22 23:20:28 471
原创 Linux SPI总线和设备驱动架构之三:SPI控制器驱动
通过第一篇文章,我们已经知道,整个SPI驱动架构可以分为协议驱动、通用接口层和控制器驱动三大部分。其中,控制器驱动负责最底层的数据收发工作,为了完成数据的收发工作,控制器驱动需要完成以下这些功能: 1. 申请必要的硬件资源,例如中断,DMA通道,DMA内存缓冲区等等; 2. 配置SPI控制器的工作模式和参数,使之可以和相应的设备进行正确的数据交换工作; 3. 向通用接口层提供
2017-02-22 23:19:47 563
原创 Linux SPI总线和设备驱动架构之二:SPI通用接口层
通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了相应的数据结构,这些数据结构一部分是SPI设备、SPI协议驱动和SPI控制器的数据抽象,一部分是为了协助数据传输而定义的数据结构。另外,通用接口层还负责SPI系统与Linux设备模型相关的初始化工作。本
2017-02-22 23:19:09 2668
原创 Linux SPI总线和设备驱动架构之一:系统概述
SPI是”Serial Peripheral Interface” 的缩写,是一种四线制的同步串行通信接口,用来连接微控制器、传感器、存储设备,SPI设备分为主设备和从设备两种,用于通信和控制的四根线分别是:CS 片选信号SCK 时钟信号MISO 主设备的数据输入、从设备的数据输出脚MOSI 主设备的数据输出、从设备的数据输入脚 因为在大多数情况下,CPU或SOC一侧通常都是工
2017-02-22 23:15:10 394
原创 Linux驱动基础:三星平台Linux SPI驱动
http://blog.csdn.net/hustyangju/article/details/20474659http://www.embedu.org/Column/Column367.htm以三星平台为例,说明spi的驱动和使用方法概述spi-s3c64xx.c文件就是三星exynos5433平台中的spi驱动控制器。 其中一个spi_2的device tree设置如下: spi_2:
2017-02-22 23:13:30 1059
原创 Linux驱动基础:va_arg,va_start,va_end等介绍
va_arg1.概述由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦;即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这种情况,有些人采用指针参数来解决问题.下面就c语言中处理不定参数数目的问题进行讨论.2.定义大家先看几宏. 在VC++6.0的include有一个stdarg.h头文件,有如下几个宏定义:#define _INTSIZEOF(n) ((sizeof(n
2017-02-22 23:11:13 1135
原创 Linux内核相关论坛问题回复(1)
http://bbs.csdn.net/topics/391048758?page=1#post-399361268 有人在论坛提了下面的问题,比较典型。最近在调试SPI子系统时发现如下错误:[ 3777.005000] BUG: scheduling while atomic: spi0/25/0x00000002[ 3777.005000] Modules linked in: focal
2017-02-22 23:07:51 471
原创 Camera HAL(Camera Preview)
看看Android系统,高通camera hal(camera3)当中camera preview数据是怎么从kernel一层一层传递,最终发给SurfaceView的。 高通的Camera HAL的module在QualcommCamera.cpp[android/hardware/qcom/camera/qcamera2/hal/wrapper] 这个Camera HAL被加载是在Cam
2017-02-22 23:00:05 5149
原创 msm平台GPIO相关的device tree设置
GPIO相关的dvice tree设置和interrupt设置gpoi号以及gpio相关的属性设置以tsp的proxy_en端口为例: i2c@78b6000 { /* BLSP1 QUP2 */ compatible = "qcom,i2c-msm-v2"; ... tmd3782@39 { com
2017-02-19 16:07:43 1588
原创 Linux驱动基础:device tree
Bootloader设置msm平台为例,在bootloader代码中会根据当前ddr开始的地址,按照一定的offset定义了kernel开始的地址,ramdisk开始地址以及TAG开始的地址。其中kernel代码开始的地址和ramdisk的地址自不必说,这两个不对的话再加载完kernel代码之后跳到kernel代码都会有问题,或者ramdisk的mount都会有问题。Device Tree也一
2017-02-19 16:07:18 4311
原创 Linux 中断(irq)控制器以及device tree设置
GPIO相关中断(高通平台为例)gpio相关的中断控制器(msm_tlmm_irq) 初始化(1) IRQCHIP_DECLARE定义irq chip#define IRQCHIP_DECLARE(name,compstr,fn) \ static const struct of_device_id irqchip_of_match_##n
2017-02-19 16:05:29 6480
原创 MDM9x25 Flashless boot(Power Manager)
设置的device tree和相关的platform初始化函数,主要设置HOST_WAKE, DEVICE_RDY, HOST_RDY 三个GPIO和设置 HOST_WAKE和DEVICE_RDY的中断函数。并设置PM和HSIC的power manager相关的notifier call函数。 mdmpm_pdata { compatible = "qcom,md
2017-02-19 16:04:55 1188
原创 Linux驱动基础:platform设备驱动
初始化以高通平台为例,会在kernel/arch/arm/mach-msm下的相应的board-xxx.c文件里边用 DT_MACHINE_START()这个宏定义一系列的芯片。以高通8916为例: 在kernel/arch/arm/mach-msm/board-8916.c文件里定义了//当然下面使用哪个要看一下。DT_MACHINE_START(MSM8916_DT,
2017-02-19 16:02:49 3741
原创 MDM9x25 Flashless boot&IPC over HSIC
概述以EXYNOS加MDM9x25为例,连接示意图如下: Exynos5433需要这几个GPIO以及HSIC,给MDM9x25上电,下载MDM9x25的binary,efs同步以及MDM9x25出错的时候的ramdump collection等工作。 下面按如下步骤来介绍每个部分所需的代码移植,修改以及流程。 - MDM9x25启动,控制GPIO配置 - MDM9x25代码下载以及e
2017-02-05 23:22:16 2720
原创 Linux : CPU Idle
CPU Idle状态可以分为很多种Idle状态,在CPU准备进入idle的时候在很多状态中进行选择以达到省电的目的。CPU Idle相关的软件架构可以分以下几种:CPUIDLE core:CPUIdle的内核驱动,在kernel\drivers\cpuidle目录下。CPUIDLE sysfs:这部分向用户层提供CPUIDLE的相关节点,以提供信息给用户。 在/sys/devices/syst
2017-02-05 15:38:21 12066
转载 Linux 定时器的引擎:clock_event_device
http://blog.csdn.net/droidphone/article/details/8017604早期的内核版本中,进程的调度基于一个称之为tick的时钟滴答,通常使用时钟中断来定时地产生tick信号,每次tick定时中断都会进行进程的统计和调度,并对tick进行计数,记录在一个jiffies变量中,定时器的设计也是基于jiffies。这时候的内核代码中,几乎所有关于时钟的操作都是在ma
2017-02-05 15:35:45 857 1
转载 Linux:时间的维护者:timekeeper
http://blog.csdn.net/droidphone/article/details/7989566本系列文章的前两节讨论了用于计时的时钟源:clocksource,以及内核内部时间的一些表示方法,但是对于真实的用户来说,我们感知的是真实世界的真实时间,也就是所谓的墙上时间,clocksource只能提供一个按给定频率不停递增的周期计数,如何把它和真实的墙上时间相关联?本节的内容正是要讨论
2017-02-05 15:32:21 1736
转载 Linux:高精度定时器(HRTIMER)的原理和实现
http://blog.csdn.net/droidphone/article/details/8074892 上一篇文章,我介绍了传统的低分辨率定时器的实现原理。而随着内核的不断演进,大牛们已经对这种低分辨率定时器的精度不再满足,而且,硬件也在不断地发展,系统中的定时器硬件的精度也越来越高,这也给高分辨率定时器的出现创造了条件。内核从2.6.16开始加入了高精度定时器架构。在实现方式上,内核的高
2017-02-05 15:31:42 12789
转载 Linux:低分辨率定时器的原理和实现
http://blog.csdn.net/droidphone/article/details/8051405利用定时器,我们可以设定在未来的某一时刻,触发一个特定的事件。所谓低分辨率定时器,是指这种定时器的计时单位基于jiffies值的计数,也就是说,它的精度只有1/HZ,假如你的内核配置的HZ是1000,那意味着系统中的低分辨率定时器的精度就是1ms。早期的内核版本中,内核并不支持高精度定时器,
2017-02-05 15:30:21 564
原创 Linux内存管理: mmap详解
mmap系统调用mmap系统调用mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。 当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用read,write等系统调用.但需注意,直接对该段内存写时不会写入超过当前文件大小的
2017-02-05 15:23:00 1880
原创 Linux内核同步:同步规则和说明
什么是同步像下面的代码段里边一样,有一个栈。一个系统调用的函数从栈里边读,一个中断函数保存数据到栈里边。 这时候,这个栈的数据就是一个需要保护的数据。在多进程系统中,有以下几种情况下会出现race condition。(这里只讨论单核的情况)1.发生中断: task1在进入临界区准备读栈的内容的时候发生中断。中断函数放数据到栈。task1在中断返回之后所读的内容,就不是原来预计的内容了。2.内核抢
2017-02-05 15:22:11 798
原创 Linux内核架构: workqueue
http://lwn.net/Articles/403891/linux内核中断处理的工作队列workqueue机制工作队列(workqueue)是另外一种将工作推后执行的形式。工作队列可以把工作推后,交由一个内核线程去执行,也就是说,这个下半部分可以在进程上下文中执行。 这样,通过工作队列执行的代码能占尽进程上下文的所有优势。最重要的就是工作队列允许被重新调度甚至是睡眠。 那么,什么情况下使用工
2017-02-05 15:10:29 1153
原创 64位ARMv8的芯片-reserved memory-mmu
基于64位ARMv8的一些AP芯片,支持32位和64位代码之间无缝运行(比如有芯片在用CortexA53 OCTA core)。以之前做过的项目为例,说明64位芯片的寄存器,以及说明在64为模式下的内存地址表示和整个Linux系统的Memory Map。 以下是整个物理内存块的大小-起始地址,这个项目的内存地址是2GB。ATAG_MEM: 4 54410002 20000000 40000000
2017-02-05 15:04:14 2637 1
原创 Linux内核架构:动态频率调节系统CPUFreq
概述在Linux中,内核提供了一套框架模型来完成CPU频率的动态调节,以达到省电的目的。 这就是所谓的CPUFreq系统。1. sysfs接口我们先从CPUFreq提供的sysfs接口入手,直观地看看它提供了那些功能。以下是我的电脑输出的结果:droidphone@990:~$ cd /sys/devices/system/cpudroidphone@990:/sys/devices/syst
2017-02-05 15:00:07 3761
转载 Linux Malloc分析-从用户空间到内核空间
本文介绍malloc的实现及其malloc在进行堆扩展操作,并分析了虚拟地址到物理地址是如何实现映射关系。 ordeder原创,原文链接: http://blog.csdn.net/ordeder/article/details/41654509背景知识进程的用户空间该结构是由进程task_struct.mm_struct进行管理的mm_struct的定义如下:struct mm_struct {
2017-02-05 14:58:10 727
转载 Linux内核同步:RCU
http://www.ibm.com/developerworks/cn/linux/l-rcu/index.html一、 引言众所周知,为了保护共享数据,需要一些同步机制,如自旋锁(spinlock),读写锁(rwlock),它们使用起来非常简单,而且是一种很有效的同步机制,在UNIX系统和Linux系统中得到了广泛的使用。但是随着计算机硬件的快速发展,获得这种锁的开销相对于CPU的速度在成倍
2017-02-05 13:01:37 433
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人