作者:彭东林

邮箱:pengdonglin137@163.com

开发板:tiny4412ADK+S700 4GB Flash

主机:Wind7 64位

虚拟机:Vmware+Ubuntu12_04

u-boot:U-Boot 2010.12

Linux内核版本:linux-3.0.31

Android版本:android-4.1.2

内核自解压时期的串口打印

在zImage格式的内核启动时会自解压内核,此时打印信息如下:

Uncompressing Linux...

这句话是在arch/arm/boot/compressed/misc.c中:

void decompress_kernel(unsigned long output_start, unsigned long free_mem_ptr_p, unsigned long free_mem_ptr_end_p, int arch_id)
{
……
putstr("Uncompressing Linux...");
……
}
static void putstr(const char *ptr)
{
char c; while ((c = *ptr++) != '\0') {
if (c == '\n')
putc('\r');
putc(c); // 根据APCS规则,c中的值会传给寄存器r0
} flush();
}

在arch/arm/boot/compressed/.misc.o.cmd中列出了编译misc.c需要依赖那些文件,其中

deps_arch/arm/boot/compressed/misc.o := \
...
arch/arm/mach-exynos/include/mach/uncompress.h \
...
arch/arm/plat-samsung/include/plat/uncompress.h \
...

在misc.c中有#include <mach/uncompress.h> 指的就是 arch/arm/mach-exynos/include/mach/uncompress.h

在mach/uncompress.h中有:#include <plat/uncompress.h>,指的就是:

arch/arm/plat-samsung/include/plat/uncompress.h

在arch/arm/plat-samsung/include/plat/uncompress.h中有putc的实现:

static void putc(int ch)
{
if (uart_rd(S3C2410_UFCON) & S3C2410_UFCON_FIFOMODE) {
int level; while () {
level = uart_rd(S3C2410_UFSTAT);
level &= fifo_mask; if (level < fifo_max)
break;
}
} else {
/* not using fifos */
while ((uart_rd(S3C2410_UTRSTAT) & S3C2410_UTRSTAT_TXE) != S3C2410_UTRSTAT_TXE)
barrier();
} /* write byte to transmission register */
uart_wr(S3C2410_UTXH, ch);
}

下面我们看一下uart_rd和uart_wr的实现

static __inline__ void
uart_wr(unsigned int reg, unsigned int val)
{
volatile unsigned int *ptr;
ptr = (volatile unsigned int *)(reg + uart_base);
*ptr = val;
} static __inline__ unsigned int
uart_rd(unsigned int reg)
{
volatile unsigned int *ptr;
ptr = (volatile unsigned int *)(reg + uart_base);
return *ptr;
}

可以看到,使用的是内联函数,并且直接操作的是底层的寄存器,那么到底操作的是哪个uart呢?我们知道,tiny4412有两个可以直接使用的串口,分别对应的是uart0和uart3。想知道这个问题,就需要看uart_base这个变量是什么值?

还是在这个文件中:

#define uart_base S3C_PA_UART + (S3C_UART_OFFSET * CONFIG_S3C_LOWLEVEL_UART_PORT)

其中S3C_PA_UART是uart控制器的基地址0x13800000,exynos4412一共有5个uart,每个uart占S3C_UART_OFFSET (0x10000)个字节,还有一个关键的宏CONFIG_S3C_LOWLEVEL_UART_PORT,它就指定了使用哪一个uart,这个宏可以在make menuconfig的时候配置,这里我们设置的是

CONFIG_S3C_LOWLEVEL_UART_PORT=0

tiny4412 串口驱动分析三 --- log打印的几个阶段之内核自解压的更多相关文章

  1. tiny4412 串口驱动分析七 --- log打印的几个阶段之内核启动阶段(earlyprintk)

    作者:彭东林 邮箱:pengdonglin137@163.com 开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 ...

  2. tiny4412 串口驱动分析八 --- log打印的几个阶段之内核启动阶段(printk tiny4412串口驱动的注册)

    作者:彭东林 邮箱:pengdonglin137@163.com 开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 ...

  3. tiny4412 串口驱动分析四 --- 修改默认的串口输出

    作者:彭东林 邮箱:pengdonglin137@163.com 开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 ...

  4. tiny4412 串口驱动分析一 --- u-boot中的串口驱动

    作者:彭东林 邮箱:pengdonglin137@163.com 开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 ...

  5. tiny4412 串口驱动分析二 --- printk的实现

    作者:彭东林 邮箱:pengdonglin137@163.com 开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 ...

  6. tiny4412 串口驱动分析五 --- LDD3上TTY驱动程序源码

    关于tty这部分请参考: <Linux设备驱动开发详解 第二版>第14章 Linux终端设备驱动 <精通Linux设备驱动程序开发>第6章 串行设备驱动程序 <Linux ...

  7. tiny4412 串口驱动分析六 --- TTY驱动架构

    转载: http://www.linuxidc.com/Linux/2013-11/92639.htm 参考: http://blog.csdn.net/lamdoc/article/details/ ...

  8. tiny4412 串口驱动分析九 --- shell终端

    作者:彭东林 邮箱:pengdonglin137@163.com 开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 ...

  9. linux串口驱动分析

    linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作 ...

随机推荐

  1. linux备忘录-bash

    知识点 环境变量 HOME PATH MAIL SHELL RANDOM // 0~32767的随机数 declare -i number=$RANDOM*10/32768 //0-9的随机数 HIS ...

  2. 如何使能diskquota

    quotacheck -avug quotaon -avug setquota -u test1 10000 20000 /mountpoint quota -uv test1

  3. [CF954G]Castle Defense

    题目大意:有$n$个点,每个点最开始有$a_i$个弓箭手,在第$i$个位置的弓箭手可以给$[i-r,i+r]$区间加上$1$的防御,你还有$k$个弓箭手,要求你最大化最小防御值 题解:二分答案,从右向 ...

  4. BZOJ3456 城市规划 【分治NTT】

    题目链接 BZOJ3456 题解 据说这题是多项式求逆 我太弱不会QAQ,只能\(O(nlog^2n)\)分治\(NTT\) 设\(f[i]\)表示\(i\)个节点的简单无向连通图的数量 考虑转移,直 ...

  5. Windows 2008 R2无法打补丁

    遇到了Windows 2008 R2无法打补丁,并且控制台上的feature和roles都是error 可下载这个补丁进行修复: System Update Readiness Tool for Wi ...

  6. 道路修建(bzoj 2435)

    Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. ...

  7. Selenium2设置隐式等待和显示等待

    1. 设置显示等待 Java代码: public static WebElement WaitForElement(WebDriver driver, String locator) { WebEle ...

  8. web应用性能优化经验总结

    常见性能优化要求      在我经历的性能优化案例中,常见的问题都是这样开始的:      a) 前台访问很慢,请帮忙分析优化      b) 用户对性能很不满意,再不解决就要投诉      c) 数 ...

  9. 7.添加OpenStack计算服务

    添加计算服务 安装和配置控制器节点 创建数据库 mysql -uroot -ptoyo123 CREATE DATABASE nova; GRANT ALL PRIVILEGES ON nova.* ...

  10. Hbase delete遇到的常见异常: Exception in thread "main" java.lang.UnsupportedOperationException

    hbase 执行批量删除时出现错误: Exception in thread "main" java.lang.UnsupportedOperationException at j ...