<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>不然你要我怎么样 &#187; UART</title>
	<atom:link href="http://www.xiangmocheng.com/tag/uart/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.xiangmocheng.com</link>
	<description>彪悍的代码不需要注释</description>
	<lastBuildDate>Wed, 30 Nov 2011 11:47:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>【转贴】Linux输出信息调试信息重定向</title>
		<link>http://www.xiangmocheng.com/2009/12/how-to-redirect-linux-debug-message/</link>
		<comments>http://www.xiangmocheng.com/2009/12/how-to-redirect-linux-debug-message/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 08:07:08 +0000</pubDate>
		<dc:creator>xiangmocheng</dc:creator>
				<category><![CDATA[Embedded]]></category>
		<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[UART]]></category>

		<guid isPermaLink="false">http://xiangmocheng.yo2.cn/articles/%e3%80%90%e8%bd%ac%e8%b4%b4%e3%80%91linux%e8%be%93%e5%87%ba%e4%bf%a1%e6%81%af%e8%b0%83%e8%af%95%e4%bf%a1%e6%81%af%e9%87%8d%e5%ae%9a%e5%90%91.html</guid>
		<description><![CDATA[在运行linux的时候，所有的调试信息可以分为三个部分 1. bootloader输出信息 U-Boot 1.3.2 (Nov 19 2016 &#8211; 22:02:08) DRAM: 64 MB Flash: 512 kB NAND: 64 MiB In: serial Out: serial Err: serial Hit any key to stop autoboot: 0 [yqliu2410 #] tftp Found DM9000 ID:90000a46 at address 10000000 ! DM9000 work in 16 bus width bd-&#62;bi_entaddr: 08:00:3e:26:0a:5b [eth_init]MAC:8:0:3e:26:a:5b: TFTP from server 192.168.1.152; [...]]]></description>
			<content:encoded><![CDATA[<p>在运行linux的时候，所有的调试信息可以分为三个部分</p>
<p>1. bootloader输出信息</p>
<p>U-Boot 1.3.2 (Nov 19 2016 &#8211; 22:02:08)<br />
DRAM: 64 MB<br />
Flash: 512 kB<br />
NAND: 64 MiB<br />
In: serial<br />
Out: serial<br />
Err: serial<br />
Hit any key to stop autoboot: 0<br />
[yqliu2410 #] tftp<br />
Found DM9000 ID:90000a46 at address 10000000 !<br />
DM9000 work in 16 bus width<br />
bd-&gt;bi_entaddr: 08:00:3e:26:0a:5b<br />
[eth_init]MAC:8:0:3e:26:a:5b:<br />
TFTP from server 192.168.1.152; our IP address is 192.168.1.155<br />
Filename &#8216;uImage&#8217;.<br />
Load address: 0&#215;30008000<br />
Loading: TT##################################done<br />
Bytes transferred = 1617316 (18ada4 hex)<br />
[up-tech2410 #] bootm<br />
## Booting image at 30008000 &#8230;<br />
Image Name: Linux-2.6.24.4<br />
Created: 2016-11-19 14:05:29 UTC<br />
Image Type: ARM Linux Kernel Image (uncompressed)<br />
Data Size: 1617252 Bytes = 1.5 MB<br />
Load Address: 30008000<br />
Entry Point: 30008040<br />
Verifying Checksum &#8230; OK<br />
Starting kernel &#8230;</p>
<p><span id="more-69493"></span></p>
<p>2. linux低级调试信息输出</p>
<p>Uncompressing Linux&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. done, booting the kernel.</p>
<p>3. linux调试信息输出</p>
<p style="margin: 5px; line-height: 150%;">Linux version 2.6.24.4 (root@vm-dev) (gcc version 3.4.6) #100 Sat Nov 19 07:47:35 CST 2016<br />
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177<br />
Machine: SMDK2410<br />
Memory policy: ECC disabled, Data cache writeback<br />
CPU S3C2410A (id 0&#215;32410002)<br />
S3C2410: core 202.800 MHz, memory 101.400 MHz, peripheral 50.700 MHz<br />
S3C24XX Clocks, (c) 2004 Simtec Electronics</p>
<p style="margin: 5px; line-height: 150%;">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.</p>
<p>现在要将所有的调试信息输出到别的串口。以com1为例(从com0开始计算)</p>
<p>一、将bootloader的输出信息输出到com1</p>
<p>这里以u-boot1.3.2为例：很简单只需要修改一个宏定义就ok</p>
<p>Vi inlcude/configs/xxxconfig.h(xxx为你定义的开发板的名字)</p>
<p>更改原有的宏</p>
<table style="border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" bordercolor="#999999">
<tbody>
<tr>
<td>
<p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;">/<span style="color: #0000cc;">*</span><br />
<span style="color: #0000cc;">*</span> select serial console configuration<br />
<span style="color: #0000cc;">*</span><span style="color: #0000cc;">/</span><br />
//#define CONFIG_SERIAL1 1 /<span style="color: #0000cc;">*</span> we use SERIAL 1 on SMDK2410 <span style="color: #0000cc;">*</span><span style="color: #0000cc;">/</span><br />
//modify <span style="color: #0000ff;">for</span> xxx2410<br />
//by lyj_uptech<br />
#define CONFIG_SERIAL2 1 /<span style="color: #0000cc;">*</span> we use SERIAL 2 on SMDK2410 <span style="color: #0000cc;">*</span><span style="color: #0000cc;">/</span></span></code></p>
</td>
</tr>
</tbody>
</table>
<p>二、将low_level 的调试信息输出到com1</p>
<p>在改之前我们先分析一下在linux启动之前它是如何使用串口的（以linux-2.6.24为例）。</p>
<p>1. 在arch/arm/boot/compressed/misc.c文件中有定义</p>
<table style="border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" bordercolor="#999999">
<tbody>
<tr>
<td>
<p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> putstr<span style="color: #0000cc;">(</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #0000cc;">*</span>ptr<span style="color: #0000cc;">)</span><br />
<span style="color: #0000cc;">{</span><br />
<span style="color: #0000ff;">char</span> c<span style="color: #0000cc;">;</span><br />
<span style="color: #0000ff;">while</span> <span style="color: #0000cc;">(</span><span style="color: #0000cc;">(</span>c <span style="color: #0000cc;">=</span> <span style="color: #0000cc;">*</span>ptr<span style="color: #0000cc;">+</span><span style="color: #0000cc;">+</span><span style="color: #0000cc;">)</span> <span style="color: #0000cc;">!</span><span style="color: #0000cc;">=</span> <span style="color: #ff00ff;">'\0'</span><span style="color: #0000cc;">)</span> <span style="color: #0000cc;">{</span><br />
<span style="color: #0000ff;">if</span> <span style="color: #0000cc;">(</span>c <span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span> <span style="color: #ff00ff;">'\n'</span><span style="color: #0000cc;">)</span><br />
<span style="color: #ff0000;">putc</span><span style="color: #0000cc;">(</span><span style="color: #ff00ff;">'\r'</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br />
<span style="color: #ff0000;">putc</span><span style="color: #0000cc;">(</span>c<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br />
<span style="color: #0000cc;">}</span><br />
<span style="color: #ff0000;">flush</span><span style="color: #0000cc;">(</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br />
<span style="color: #0000cc;">}</span></span></code></p>
<p style="margin: 5px; line-height: 150%;">
</td>
</tr>
</tbody>
</table>
<p>2. arch/arm/boot/compressed/misc.中的函数decompress_kernel就是使用的putstr来打印的如下输出信息：</p>
<table style="border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" bordercolor="#999999">
<tbody>
<tr>
<td>
<p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;">Uncompressing Linux<span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span><span style="color: #0000cc;">.</span> done<span style="color: #0000cc;">,</span> booting the kernel</span></code></p>
</td>
</tr>
</tbody>
</table>
<p>3. 追根溯源，putstr函数最终调用的是putc（请注意这里的putc不是在misc.c函数中定义的icedcc_putc，因为没有CONFIG_CPU_V6宏定义），真正的底层操作在文件include/asm-arm/plat-s3c/uncompress.h</p>
<p>4. 解析该文件</p>
<table style="border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" bordercolor="#999999">
<tbody>
<tr>
<td>
<p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><span style="color: #ff9900;">/* we can deal with the case the UARTs are being run<br />
* in FIFO mode, so that we don't hold up our execution<br />
* waiting for tx to happen...<br />
*/</span><br />
<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> <span style="color: #ff0000;">putc</span><span style="color: #0000cc;">(</span><span style="color: #0000ff;">int</span> ch<span style="color: #0000cc;">)</span><br />
<span style="color: #0000cc;">{</span><br />
<span style="color: #0000ff;">if</span> <span style="color: #0000cc;">(</span>uart_rd<span style="color: #0000cc;">(</span>S3C2410_UFCON<span style="color: #0000cc;">)</span> <span style="color: #0000cc;">&amp;</span> S3C2410_UFCON_FIFOMODE<span style="color: #0000cc;">)</span> <span style="color: #0000cc;">{</span><br />
<span style="color: #0000ff;">int</span> level<span style="color: #0000cc;">;</span><br />
<span style="color: #0000ff;">while</span> <span style="color: #0000cc;">(</span>1<span style="color: #0000cc;">)</span> <span style="color: #0000cc;">{</span><br />
level <span style="color: #0000cc;">=</span> uart_rd<span style="color: #0000cc;">(</span>S3C2410_UFSTAT<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br />
level <span style="color: #0000cc;">&amp;</span><span style="color: #0000cc;">=</span> fifo_mask<span style="color: #0000cc;">;</span></span></code></p>
<p><span style="color: #0000ff;">if</span> <span style="color: #0000cc;">(</span>level <span style="color: #0000cc;">&lt;</span> fifo_max<span style="color: #0000cc;">)</span><br />
<span style="color: #0000ff;">break</span><span style="color: #0000cc;">;</span><br />
<span style="color: #0000cc;">}</span><br />
<span style="color: #0000cc;">}</span> <span style="color: #0000ff;">else</span> <span style="color: #0000cc;">{</span><br />
<span style="color: #ff9900;">/* not using fifos */</span><br />
<span style="color: #0000ff;">while</span> <span style="color: #0000cc;">(</span><span style="color: #0000cc;">(</span>uart_rd<span style="color: #0000cc;">(</span>S3C2410_UTRSTAT<span style="color: #0000cc;">)</span> <span style="color: #0000cc;">&amp;</span> S3C2410_UTRSTAT_TXE<span style="color: #0000cc;">)</span> <span style="color: #0000cc;">!</span><span style="color: #0000cc;">=</span> S3C2410_UTRSTAT_TXE<span style="color: #0000cc;">)</span><br />
barrier<span style="color: #0000cc;">(</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br />
<span style="color: #0000cc;">}</span><br />
<span style="color: #ff9900;">/* write byte to transmission register */</span><br />
uart_wr<span style="color: #0000cc;">(</span>S3C2410_UTXH<span style="color: #0000cc;">,</span> ch<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br />
<span style="color: #0000cc;">}</span></p>
<p style="margin: 5px; line-height: 150%;">
</td>
</tr>
</tbody>
</table>
<p>该函数中调用的两个函数，uart_rd uart_wr在同一个文件中定义</p>
<table style="border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" bordercolor="#999999">
<tbody>
<tr>
<td>
<p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><span style="color: #0000cc;">#</span><span style="color: #ff0000;">define</span> uart_base S3C24XX_PA_UART <span style="color: #0000cc;">+</span> <span style="color: #0000cc;">(</span>0x4000<span style="color: #0000cc;">*</span>CONFIG_S3C_LOWLEVEL_UART_PORT<span style="color: #0000cc;">)</span><br />
<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">__inline__</span> <span style="color: #0000ff;">void</span><br />
uart_wr<span style="color: #0000cc;">(</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> reg<span style="color: #0000cc;">,</span> <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> val<span style="color: #0000cc;">)</span><br />
<span style="color: #0000cc;">{</span><br />
<span style="color: #0000ff;">volatile</span> <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> <span style="color: #0000cc;">*</span>ptr<span style="color: #0000cc;">;</span><br />
ptr <span style="color: #0000cc;">=</span> <span style="color: #0000cc;">(</span><span style="color: #0000ff;">volatile</span> <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> <span style="color: #0000cc;">*</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">(</span>reg <span style="color: #0000cc;">+</span> uart_base<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br />
<span style="color: #0000cc;">*</span>ptr <span style="color: #0000cc;">=</span> val<span style="color: #0000cc;">;</span><br />
<span style="color: #0000cc;">}</span><br />
<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">__inline__</span> <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span><br />
uart_rd<span style="color: #0000cc;">(</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> reg<span style="color: #0000cc;">)</span><br />
<span style="color: #0000cc;">{</span><br />
<span style="color: #0000ff;">volatile</span> <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> <span style="color: #0000cc;">*</span>ptr<span style="color: #0000cc;">;</span><br />
ptr <span style="color: #0000cc;">=</span> <span style="color: #0000cc;">(</span><span style="color: #0000ff;">volatile</span> <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> <span style="color: #0000cc;">*</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">(</span>reg <span style="color: #0000cc;">+</span> uart_base<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br />
<span style="color: #0000ff;">return</span> <span style="color: #0000cc;">*</span>ptr<span style="color: #0000cc;">;</span><br />
<span style="color: #0000cc;">}</span></span></code></p>
<p style="margin: 5px; line-height: 150%;">
</td>
</tr>
</tbody>
</table>
<p>从宏定义uart_base中就可以清楚的看到，当CONFIG_S3C_LOWLEVEL_UART_PORT为0时,uart_base的值为0&#215;50000000,也就是uart0的控制寄存器基地址。如果要使用uart1的话就把CONFIG_S3C_LOWLEVEL_UART_PORT赋值为1就可以了。</p>
<p>5、真正更改的地方只有一个</p>
<p><img src="http://blogimg.chinaunix.net/blog/upfile2/081120131415.jpg" border="0" alt="" /></p>
<p>下级目录</p>
<p><img src="http://blogimg.chinaunix.net/blog/upfile2/081120132127.jpg" border="0" alt="" /></p>
<p>修改为1就ok！</p>
<p>6. 需要注意的地方（你使用的串口初始化了么）</p>
<p>我在整个内核中找遍了解压内核之前运行的代码，都找不到关于串口初始化的代码。所以说，linux在启动之前的串口初始化是依赖bootloader的，要想正常的输出，就必须使用你的bootloader使用的串口，因为在bootloader中进行了对要使用的串口进行了初始化。要保证你的bootloader兼容性很好，那就在bootloader中把所有的串口都初始化一遍。</p>
<p>如果你没有初始化串口，一旦调用putstr，程序就死掉了！</p>
<p>三、将linux的信息输出到com1</p>
<p>将linux运行的信息输出到com1就太简单了，直接到bootloader里面改linux的传递参数就可以了。</p>
<table style="border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" bordercolor="#999999">
<tbody>
<tr>
<td>
<p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;">setenv bootargs root<span style="color: #0000cc;">=</span><span style="color: #0000cc;">/</span>dev<span style="color: #0000cc;">/</span>mtdblock2 noinitrd console<span style="color: #0000cc;">=</span>ttySAC1<span style="color: #0000cc;">,</span>115200<br />
saveenv</span></code></p>
</td>
</tr>
</tbody>
</table>
<p>现在启动一切ok！</p>
<p>感谢yqliu29的支持，没有他的调试程序，我始终的无法知道linux的内核是否正确调用，也无法定位问题！</p>
<p>这里附上他给我的程序（这里的三个灯分别对应的io管脚是 GPF5/6/7）</p>
<table style="border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" bordercolor="#999999">
<tbody>
<tr>
<td>
<p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;">#<span style="color: #0000ff;">if</span> 0<br />
asm volatile<span style="color: #0000cc;">(</span><br />
<span style="color: #ff00ff;">"ldr r6, =0x5400\n\r"</span><br />
<span style="color: #ff00ff;">"ldr r7, =0x56000020\n\r"</span><br />
<span style="color: #ff00ff;">"str r6, [r7]\n\r"</span><br />
<span style="color: #ff00ff;">"ldr r6, =0xC0\n\r"</span><br />
<span style="color: #ff00ff;">"ldr r7, =0x56000024\n\r"</span><br />
<span style="color: #ff00ff;">"str r6, [r7]"</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br />
#<span style="color: #0000ff;">endif</span></span></code></p>
</td>
</tr>
</tbody>
</table>
<p>原帖地址：http://blog.chinaunix.net/u1/57747/showart_1432451.html
<div style="margin-top: 10px">
<p><strong>转载请注明：</strong> 转载自<a href="http://www.xiangmocheng.com/">不然你要我怎么样</a></t>        </br><strong>本文链接地址:</strong> <a href="http://www.xiangmocheng.com/2009/12/how-to-redirect-linux-debug-message/">【转贴】Linux输出信息调试信息重定向</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.xiangmocheng.com/2009/12/how-to-redirect-linux-debug-message/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

