s3c2440

友善mini2440裸机开发原理+源码

一个人想着一个人 提交于 2020-01-10 03:36:13
友善mini2440裸机开发源码 源码+开发工具 开发工具:minitools、gcc-4.4.3、vim等 **我们需要先设置cpu工作模式+关闭看门狗+关闭中断后再执行我们自己的代码,因为本文是将代码下载到内存中运行,所以不具备跳转绝对地址的能力,也就不能处理中断。 1. led mini2440有4个可供用户编程的led,分别是nled_1、nled_2、nled_3、nled_4: 他们分别连向GPB5、6、7、8,由于这里的led接入了上拉电阻,我们的cpu引脚应输出0而使led发光,输出1led熄灭。 接下来,我们先查看s3c2440的用户手册,找到GPB组的寄存器组: 这里就是我们需要编程的寄存器。第一个是GPB组IO的控制寄存器,用于选择配置引脚工作模式,第二个是数据寄存器,如果引脚被配置为输入口或其他功能口,我们将从这个寄存器中读出对应的数据。如果作为输出口,我们就从这个寄存器中写入需要输出的数据。最后是上拉寄存器。s3c2440每个GPIO的引脚都内部配置了上拉功能,不需要的时候写1关闭即可。 代码链接: https://download.csdn.net/download/weixin_38716790/12085350 2. 串口 mini2440有3个可编程串口,分别是串口0、1、2,其中串口0已经接了RS232接口出来

芯片时钟体系

核能气质少年 提交于 2020-01-07 03:39:07
记录一下时钟相关学习笔记(S3C2440 ARM-CHIP-32bit为例) 问题引入: Q: CPU运行速度很快,但是外设运行的则比较慢,那它们的时钟源怎么匹配呢? A: 它们有不同的时钟源。 CLOCKS 计算机的心脏,给主板的芯片提供时钟信号,与晶振连接给其他部件提供时钟信号。 WHAT S3C2440有三种时钟源: FCLK:用于CPU核。 HCLK:用于AHB总线上的设备,比如CPU核存储器控制器、中断控制器、LCD控制器、DMA和USB主机模块等高性能的设备。 PCLK:用于APB总线上的设备,比如WATCHDOG、IIS、I2C、PWM定时器、MMC接口、ADC、UART、GPIO、RTC和SPI等低速设备。 HOW TO WORK 产生这些时钟源的简要流程可以这样描述: 系统刚上电的时候,FCLK即等于外部输入的时钟。一般是12M或者24M的晶振。等待晶振输出稳定(此时FCLK=Fin),reset 信号恢复高电平,CPU 开始执行指令。 然后用软件的方式打开MPLL(锁相环电路,用于提高系统时钟频率),把12M或者24M的时钟频率提高到100-400M(针对于S3C2440)。 再然后,通过设置一些寄存器(设置分频器),可以改变FCLK、HCLK、PCLk的时钟频率比例(比如说1:2:2) 这样,其他的两个时钟源也就提高了。要明白的是,系统在运行的时候

ARM-Linux驱动--MTD驱动分析(二)

爱⌒轻易说出口 提交于 2019-12-27 00:33:04
主机:Gentoo Linux 11.2 with linux kernel 3.0.6 硬件平台:FL2440(S3C2440)with linux kernel 2.6.35 原创作品,转载请标明出处 http://blog.csdn.net/yming0221/article/details/7205713 *接上文 ARM-Linux驱动--MTD驱动分析(一) 1、mtd_notifier结构体 //MTD设备通知结构体 struct mtd_notifier { void (*add)(struct mtd_info *mtd);//加入MTD原始/字符/块设备时执行 void (*remove)(struct mtd_info *mtd);//移除MTD原始/字符/块设备时执行 struct list_head list;//list是双向链表,定义在include/linux/list.h }; 而struct list_head定义在/include/linux/list.h中,内核中其宏定义和函数如下 INIT_LIST_HEAD(ptr) 初始化ptr节点为表头,将前趋与后继都指向自己。 LIST_HEAD(name) 声明并初始化双向循环链表name。 static inline void __list_add(struct list_head *new,

s3c2440裸机-内存控制器(四、SDRAM原理-cpu是如何访问sdram的)

对着背影说爱祢 提交于 2019-12-16 12:20:25
1.SDRAM原理 (1) SDRAM内部存储结构 : (2)再看看与2440连接的 SDRAM原理图 : sdram引脚说明: A0-A12:地址总线 D0-D15:数据总线(位宽16,2片级联成位宽32) BA0-BA1:bank选择 nSCS:片选 nSRAS:行地址选择 nSCAS:列地址选择 nWE:写使能 SCLK:时钟 SCKE:时钟使能 (3) SDRAM的地址范围: 之前我们讲“二、不同位宽外设与CPU地址总线的连接”这一节的时候,我们留下了一个问题, SDRAM的地址范围 是多少? 我们知道地址范围肯定是base_addr + size。我们根据片选接了nGCS6,base_addr=0x3000,0000,那么size是多大呢? 下图是我截取的sdram手册上的特性描述: 我们看见容量为:4M word x 16-bit x 4-bank = 32M,再看原理图我们是两片级联,所以容量为4M word x 32-bit x 4-bank=64M。所以地址范围是 [0x3000_0000 ~ 0x33ff_ffff] (4) SDRAM数据访问原理: 我们知道64M=2^20*2^6=2^26,那么需要26条地址线,再看看原理图,我们发现SDRAM的地址线A[12:0]只有13条,那么最多只能访问2^13=8K的数据,地址线明显配不上这么大的容量

s3c2440裸机编程-内存控制器(二、不同位宽设备的连接)

妖精的绣舞 提交于 2019-12-10 11:44:57
不同位宽设备的连接 我们先看一下2440芯片手册上外设rom是如何与CPU地址总线连接的。 8bit rom与CPU地址线的连接 8bit*2 rom与CPU地址线的连接 8bit*4 rom与CPU地址线的连接 16bit rom与CPU地址线的连接 16bit*2 rom与CPU地址线的连接 从上面的图中,我们知道可以对2片位宽为8bit的外设扩展级联成1个16bit的外设,同理可用4片位宽为8bit的外设进行级联成1个32bit的外设... 从上面的图中,我们还看见一个规律: 当外设总线位宽为8bit时, 外设A0接CPU的地址总线ADDR[0], A[1]->ADDR[1] ...A[15]->ADDR[15] 当外设总线位宽为16bit时,外设A0接CPU的地址总线ADDR[1], A[1]->ADDR[2] ...A[15]->ADDR[16] 当外设总线位宽为32bit时,外设A0接CPU的地址总线ADDR[2], A[1]->ADDR[3] ...A[15]->ADDR[17] 那么为什么要这样设计呢? 我们先看一个例子: 假设CPU执行: MOV R0, #3 LDRB R1, [R0] @ 从内存地址为3的地方,读出一个字节 如图有8bitROM、16bitROM、32bitROM (1)对于8bitROM ,8bit是一次读写的最小单位

s3c2440裸机编程-内存控制器(一、内存接口概念)

痴心易碎 提交于 2019-12-09 13:26:56
1.内存接口概念 S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚(GPA-GPH)),有串口控制器 (接有TXD RXD引脚),有memory controller内存控制器,有Nand控制器等... 1.不同类型的控制器: (1)GPIO控制器属于门电路,不涉及到时序,相对简单。 (2)串口控制器属于协议类接口,类似的协议类接口还有iic、iis、spi等。 (3)前面的GPIO/门电路接口、协议类接口,都不会把地址输出到外部设备,仅仅只是将地址写入到相应的控制器。 接下来的内存类接口,会把地址输出到外部,cpu将地址写入内存控制器,内存控制器还需访问外部设备,比如NorFlash、网卡、SDRAM。 2.CPU是如何访问各个不同的寄存器的呢? GPIO/门电路接口、协议类接口、内存类接口都属于CPU的统一编址。但对于Nand Flash,它没有独立的地址线和cpu的地址总线相连接,因此它不参与CPU的统一编址。 (1)对于门电路接口、协议类接口,直接访问寄存器即可。 (2)对于内存类接口,交给内存控制器去处理。下面详细分析: CPU只管发出一个地址,内存控制器根据该地址范围选择不同的模块,然后从模块中得到数据或者发送数据到模块中。 如下图,SDRAM、DM9000网卡、Nor Flash都接在JZ2440的数据总线和地址总线上,CPU把数据和地址发送出去

s3c2440裸机编程-时钟编程(一、2440时钟体系介绍)

为君一笑 提交于 2019-12-07 12:03:25
1.总线框架 下图是2440的总线框架,其中有AHB(Advanced High performance Bus)高速总线,APB(Advanced Peripheral Bus)外围总线。 不同总线对应不同的时钟。 SOC <-> FCLK AHB <-> HCLK APB <-> PCLK 其中: 1.使用AHB总线的有:LCD控制器、usb控制器、中断控制器、内存控制器等... 2.使用APB总线的有:i2c、spi、timer、gpio、adc等...具体上图。 2.时钟框架 下图表示2440 Soc的时钟框图: 下面从细节上讲解时钟体系: 1.如何选择时钟源: s3c2440时钟源有2个,一个是OSC,一个是外部时钟EXTCLK,上面的时钟框图有标记,当然大家也可以查看手册“Figure 7-1. Clock Generator Block Diagram”。 那么如何选择是OSC还是EXTCLK呢? 打开原理图,OM3,OM2的引脚接地,那么OM[3,2]=00.所以根据手册“Table 7-1. Clock Source Selection at Boot-Up”可知时钟源为OSC晶振。 如何得到HCLK,PCLK,UCLK? 先了解下PLL, DIV PLL:用锁相环进行倍频 DIV:用分频器进行分频 如下图: 生成的MPLL(Main PLL)和UPLL(USB

mini2440_LCD_x35移植

為{幸葍}努か 提交于 2019-12-05 09:45:37
从linux 2.6起引入了新一套的驱动管理和注册机制:platform_device 和piatform_driver. (platform代表平台);设备用platform_device表示,驱动用piatform_driver进行注册。 Linuxplatformdriver机制和传统的devicedriver机制(通过driver_register函数进行注册)相比,一个十分明显的优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platformdevice提供的标准接口进行申请并使用。这样提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性(这些标准接口是安全的)。 Platform机制的本身使用并不复杂,由两部分组成:platform_device和platfrom_driver。 通过Platform机制开发底层驱动的大致流程为:定义resoucre->定义platform_device->定义platform_driver->注册platform_driver。 内核里已经有很完善的lcd驱动了,我们只要根据所用的LCD进行简单的修改。 首先要确认的就是设备的资源信息,例如设备的地址,中断号等。 在2.6内核中platform设备用结构体platform_device来描述,该结构体定义在 kernel

S3C2440内存控制器详解

泄露秘密 提交于 2019-12-04 18:45:47
S3C2440A Memory Map after Reset S3C2440的内存空间划分为不同的块,当CPU向内存控制器发出地址,内存控制器根据地址范围,发出对应片选信号到片选引脚,实现对不同设备的控制。 BANK0 BUS WIDTH The data bus of BANK0 (nGCS0) should be configured with a width as one of 16-bit and 32-bit ones. Because the BANK0 works as the booting ROM bank (map to 0x0000_0000), the bus width of BANK0 should be determined before the first ROM access, which will depend on the logic level of OM[1:0] at Reset. MEMORY (SROM/SDRAM) ADDRESS PIN CONNECTIONS Memory Interface with 8-bit ROM Memory Interface with 8-bit ROM x 2 Memory Interface with 8-bit ROM x 4 Memory Interface with 16-bit ROM

移植 linux kernel 2.6.32 至 mini2440 板

橙三吉。 提交于 2019-12-04 09:54:19
1. 移植准备 1.1 获取Linux内核源代码(linux-2.6.32.tar.gz) $ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.gz 1.2 解压内核源代码 $ tar xvzf linux-2.6.32.tar.gz 得linux-2.6.32源代码目录 1.3 指定交叉编译变量 修改总目录下的 Makefile 原 export KBUILD_BUILDHOST := $(SUBARCH) ARCH ?= $(SUBARCH) CROSS_COMPILE ?= 改为: export KBUILD_BUILDHOST := $(SUBARCH) ARCH ?= arm CROSS_COMPILE ?= /usr/local/arm/4.3.2/bin/arm-linux- 其中,ARCH 是指定目标平台为 arm,CROSS_COMPILE 是指定交叉编译器 接下来,要测试一下 linux 的编译是否能正常通过。 执行: $ make s3c2410_defconfig 使用缺省内核配置文件,s3c2410_defconfig 是 SMDK2440 的 缺省配置文件 $ make 编译时间较长 编译通过,在此我们先不必烧写到开发板验证它的正确性。 2. 开始移植 2.1