S3C2440之UART驱动代码模板(RealView MDK)

好记心不如烂笔头,为方便以后查看代码及代码重复利用,这里贴出S3C2440 UART驱动代码。使用友善MINI2440开发板,开发环境为RealView MDK 4.22。需要注意的是,本代码中,对GPIO的初始化放在了s3c2440.s中完成,采用keil自带的html方式进行配置。

该源码结构简单明了,原始工程下载地址:点击打开链接

UART控制器初始化:

void Uart_Init(void)
{
#define rULCON0			(*(volatile unsigned int*)0x50000000)
#define rUCON0			(*(volatile unsigned int*)0x50000004)
#define rUBRDIV0		(*(volatile unsigned int*)0x50000028)

#define PCLK			50000000
#define BUADRATE		115200

	rULCON0 = 0x03;		//No parity, One stop bit, 8-bits data
	rUCON0	= 0x05;		//Tx Enable, Rx Enable, PCLK as source clock
	rUBRDIV0 = (int)(PCLK / (BUADRATE * 16)) - 1;	//115200bps
}

字符发送函数:

void Uart_Putc(unsigned char c)
{
#define rUTRSTAT0		(*(volatile unsigned int*)0x50000010)
#define rUTXH0			(*(volatile unsigned int*)0x50000020)

#define BUFFER_EMPTY	(1 << 1)

	while(!(rUTRSTAT0 & BUFFER_EMPTY));
	rUTXH0 = c;
}

字符接收函数:

unsigned char Uart_Getc(void)
{
#define rUTRSTAT0		(*(volatile unsigned int*)0x50000010)
#define rURXH0			(*(volatile unsigned int*)0x50000024)

#define BUFFER_READY	(1 << 0)

	while(!(rUTRSTAT0 & BUFFER_READY));
	return rURXH0;
}

为了使用printf库函数,需要进行如下重映射:

struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};  

/* FILE is typedef'd in stdio.h. */
FILE __stdout;  

int fputc(int ch, FILE *f)
{
    Uart_Putc(ch); 

    return ch;
} 

int ferror(FILE *f) {
  /* Your implementation of ferror */
  return EOF;
}

测试代码:

int main(void)
{
	unsigned char ch;

	//clock_init();
	Uart_Init();
	printf("%s, %d", __FILE__, __LINE__);
	while(1)
	{
		ch = Uart_Getc();
		Uart_Putc(ch);
	}
}
时间: 2024-11-03 15:46:38

S3C2440之UART驱动代码模板(RealView MDK)的相关文章

S3C2440之Camera驱动代码模板(RealView MDK)

好记心不如烂笔头,为方便以后查看代码及代码重复利用,这里贴出S3C2440 Camera驱动代码.使用友善MINI2440开发板,开发环境为RealView MDK 4.22. 原始工程下载地址:点击打开链接 最初,本人在网上下载了许多mini2440 camera驱动的代码,但结果都不尽人意,因为这些代码看起来都比较晦涩难懂,都是直接对寄存器进行位与位或操作,且有的代码排版布局很乱,对初学者来说难度较大.由于本人接触了STM32开发后,觉得STM32的库函数给初学者提供了很大帮助,仅仅通过函数

S3C2440之MMU驱动代码模板(RealView MDK)

好记心不如烂笔头,为方便以后查看代码及代码重复利用,这里贴出自己写的S3C2440 MMU代码库.使用友善MINI2440开发板,开发环境为RealView MDK 4.22. 该源码结构简单明了,原始工程下载地址:点击打开链接 Register 0, ID code register: unsigned int MMU_ReadID(void) { unsigned int id; __asm("mrc p15, 0, id, c0, c0, 0"); return id; } Re

S3C2440之LCD驱动代码模板(RealView MDK)

好记心不如烂笔头,为方便以后查看代码及代码重复利用,这里贴出S3C2440 LCD控制初始化代码.使用友善MINI2440开发板,LCD为320*240,开发环境为RealView MDK 4.22. 该源码结构简单明了,原始工程下载地址:点击打开链接 寄存器宏定义: #define rGPCCON (*(volatile unsigned long *)0x56000020) #define rGPCUP (*(volatile unsigned long *)0x56000028) #def

ARM-Linux S5PV210 UART驱动(转)

ARM-Linux S5PV210 UART驱动(3)----串口核心层.关键结构体.接口关系 尽管一个特定的UART设备驱动完全可以按照tty驱动的设计方法来设计,即定义tty_driver并实现tty_operations其中的成员函数,但是Linux已经在文件serial_core.c中实现了UART设备的通用tty驱动层,称为串口核心层,这样,UART驱动的主要任务变成了实现serial_core.c中定义的一组uart_xxx接口而非tty_xxx接口. uart设备是继tty_dri

UART驱动分析

在linux用户层上要操作底层串口需要对/dev/ttySxxx操作,这里的ttySx指实际的终端串口. 以下以全志A64为实例,分析UART驱动以及浅谈TTY架构. linux-3.10/drivers/tty/serial/sunxi-uart.c: 1 static const struct of_device_id sunxi_uart_match[] = { 2 { .compatible = "allwinner,sun8i-uart", }, 3 { .compatibl

在KEIL realview MDK下为单一C文件生成.LIB文件

纠结了一天,竟然没有一个网页完整的说清楚的这个问题,莫非太简单了大家不屑于说?看大多数说的都是简单地将整个工程转换成.LIB,在Project->Options for Target->Output下,选择Create Library,就可以了. 不过这样生成的lib文件巨大,我现在编译的工程最后生成的lib有2.6MB. 后来还是从KEIL官网英文资料中找到灵感(http://www.keil.com/support/docs/2610.htm): 1.右键点击工程,假设为a,选Add Gr

Linux kernel 之 uart 驱动解析

uart 是一种非常之常见的总线,比如DEBUG信息输出,小数据量数据传输,485,以及蓝牙的控制,GPS,很多都是通过uart 进行数据传输并进行控制. 在Linux kernel 内部,uart 通常是作为 一个 tty 设备对其进行控制,也是就是一个字符设备文件,可对其进行读写操作. kernel version 4.4.12 首先先看一下基本的 结构体 和 API 操作. // include/linux/serial_core.h // uart 驱动结构体 struct uart_d

tty初探—uart驱动框架分析(二)uart_add_one_port

在前面的一篇文章中,我们分析了一个 uart_driver 的向上注册过程,主要是 tty 的一些东西,知道了 tty 注册了一个字符设备驱动,我们在用户空间 open 时将调用到 uart_port.ops.startup ,在用户空间 write 则调用 uart_port.ops.start_tx ,还知道了如何 read 数据等等.但是,这些都是内核帮我们实现好的,在真正的驱动开发过程中几乎不涉及那些代码的修改移植工作,真正需要我们触碰的是 uart_port 这个结构体,它真正的对应于

tty初探—uart驱动框架分析

本文参考了大量牛人的博客,对大神的分享表示由衷的感谢. 主要参考: tty驱动分析 :http://www.wowotech.net/linux_kenrel/183.html Linux TTY驱动--Uart_driver底层:http://blog.csdn.net/sharecode/article/details/9196591 Linux TTY驱动--Serial Core层  :http://blog.csdn.net/sharecode/article/details/9197