s3c2410_gpio_cfgpin(S3C2410_GPB0, S3C2410_GPB0_TOUT0);
我们可以这样控制外设寄存器,想过它怎么实现的吗?
首先分析下 struct machine_desc (include/asm-arm/Mach/Arch.h)
这是一个非常重要的结构体,内核通过 machine_desc 来控制体系架构相关部分的初始化,包括map_io,init_irq,init_machine,pthys_io,timer等
struct machine_desc {
/*
* Note! The first five elements are used
* by assembler code in head-armv.S
*/
unsigned int nr; /* architecture number */
unsigned int phys_ram; /* start of physical ram */
unsigned int phys_io; /* start of physical io */
unsigned int io_pg_offst; /* byte offset for io
* page tabe entry */
const char *name; /* architecture name */
unsigned long boot_params; /* tagged list */
unsigned int video_start; /* start of video RAM */
unsigned int video_end; /* end of video RAM */
unsigned int reserve_lp0 :1; /* never has lp0 */
unsigned int reserve_lp1 :1; /* never has lp1 */
unsigned int reserve_lp2 :1; /* never has lp2 */
unsigned int soft_reboot :1; /* soft reboot */
void (*fixup)(struct machine_desc *,
struct tag *, char **,
struct meminfo *);
void (*map_io)(void);/* IO mapping function */
void (*init_irq)(void);
struct sys_timer *timer; /* system tick timer */
void (*init_machine)(void);
};
|
那我们怎么创建自己的machine_desc呢?
内核给我们提供了一个宏:
#define MACHINE_START(_type,_name) /
const struct machine_desc __mach_desc_##_type /
__attribute__((__section__(".arch.info.init"))) = { /
.nr = MACH_TYPE_##_type, /
.name = _name,
#define MACHINE_END /
};
|
这样我们就可以定义自己的machine_desc了
MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switch
* to SMDK2410 */
/* Maintainer: Jonas Dietsche */
.phys_ram = S3C2410_SDRAM_PA,
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
.boot_params = S3C2410_SDRAM_PA + 0x100,
.map_io = smdk2410_map_io,
.init_irq = smdk2410_init_irq,
.init_machine = sdmk2410_init,
.timer = &s3c24xx_timer,
MACHINE_END
|
这里我们创建了 machine_desc,并给其中一些成员赋了值,这相当于是内核给我们提供的编程接口,这样就可以调用自己的函数了。
这其中map_io 在 setup_arch 中调用调用,我们跟进去会发现:
在smdk2410_map_io-->s3c24xx_init_io(smdk2410_iodesc, ARRAY_SIZE(smdk2410_iodesc))->iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc)) 看到:
void __init iotable_init(struct map_desc *io_desc, int nr)
{
int i;
for (i = 0; i < nr; i++)
create_mapping(io_desc + i);
}
|
就是在这里调用create_mapping()创建的页表,这里的第一个参数,map_desc 定义如下:
struct map_desc {
unsigned long virtual;
unsigned long physical;
unsigned long length;
unsigned int type;
};
|
create_mapping()就是通过这个结构体创建的映射表,这样我们可以通过创建 map_desc 然后传给这个函数就可以创建相应的 虚拟地址-->物理地址 映射.
在 inlcude/asm-arch/Arch-s3c2410/Map.h
定义了每一种资源用于 map_desc 变量的宏定义,如:
/* MMC controller - available on the S3C2400 */
#define S3C2400_VA_MMC S3C2400_ADDR(0x00700000)
#define S3C2400_PA_MMC (0x15A00000)
#define S3C2400_SZ_MMC SZ_1M
/* UARTs */
#define S3C24XX_VA_UART S3C2410_ADDR(0x00800000)
#define S3C2400_PA_UART (0x15000000)
#define S3C2410_PA_UART (0x50000000)
#define S3C24XX_SZ_UART SZ_1M
/* Timers */
#define S3C24XX_VA_TIMER S3C2410_ADDR(0x00900000)
#define S3C2400_PA_TIMER (0x15100000)
#define S3C2410_PA_TIMER (0x51000000)
#define S3C24XX_SZ_TIMER SZ_1M
|
然后针对具体的某个外设,有具体寄存器的定义,如:
include/asm/arch-s3c2410/regs-timer.h
#ifndef __ASM_ARCH_REGS_TIMER_H
#define __ASM_ARCH_REGS_TIMER_H "$Id: timer.h,v 1.4 2003/05/06 19:30:50 ben Exp $"
#define S3C2410_TIMERREG(x) (S3C24XX_VA_TIMER + (x))
#define S3C2410_TIMERREG2(tmr,reg) S3C2410_TIMERREG((reg)+0x0c+((tmr)*0x0c))
#define S3C2410_TCFG0 S3C2410_TIMERREG(0x00)
#define S3C2410_TCFG1 S3C2410_TIMERREG(0x04)
#define S3C2410_TCON S3C2410_TIMERREG(0x08)
#define S3C2410_TCFG_PRESCALER0_MASK (255<<0)
#define S3C2410_TCFG_PRESCALER1_MASK (255<<8)
#define S3C2410_TCFG_PRESCALER1_SHIFT (8)
#define S3C2410_TCFG_DEADZONE_MASK (255<<16)
#define S3C2410_TCFG_DEADZONE_SHIFT (16)
.........................
|
关键字:S3C2410 静态映射
引用地址:
基于S3C2410-ARM-Linux静态映射分析
推荐阅读最新更新时间:2024-03-16 15:04
基于S3C2410的恒温式自动量热仪设计
0 引言 量热仪是能测定固、液态物质,如煤炭、火药、粘度油、食品、饲料等可燃物质热值的仪器。传统的量热仪受客观因素影响较大,本文设计自动量热仪可减少客观因素的影响,实现数据的实时传输与实时处理,并使量热仪具有网络通信功能,能够实现数据的网络传输,并实现对量热仪的远程控制。 近年来随着嵌入式技术的不断成熟,其成本也不断下降,本身所具有的规模可变、扩展灵活、有较高的实时性和稳定性、系统内核小的优点逐渐凸现出来。 1 基本原理 恒温式量热仪通过氧弹法测量热值。通过放在氧弹中的物质燃烧并使燃烧放出的热量通过弹筒传递给水及仪器系统,再根据水温的变化计算出物质的发热量。其测量的基本框图如图1所示。根据氧弹法测量的基本原理,发热量
[测试测量]
SD存储及基于S3C2410的应用
1 引言 SD卡( Secure DigitalMemory Card)是一种基于Flash的新一代存储器,它着重数据存储的安全、容量和性能,是许多便携式电子产品如数码相机、手提电话, PDA 等理想的外部存储介质。 2 SD的基本概念 2. 1 SD的通信协议 SD卡系统可以在两种通信协议下工作: SD协议和SP I协议。用户可以在硬件初始化时自由选择SD卡系统的通信协议。对于特定的硬件电路,用户只需使用一种通信协议即可。 本文根据笔者的硬件,仅讨论最常用的SD协议。 2. 2 SD数据传输方式 SD支持两种数据传输方式: 1 - bit方式(标准总线)和4- bit方式(宽总线) 。在
[模拟电子]
触摸屏的移植(s3c2410)
触摸屏驱动的名称: dev/mounse0 我们看一下/proc/devices # cat /proc/devices Character devices: 6 lp 7 vcs 10 misc 13 input 29 fb 90 mtd 查看触摸屏: cat /proc/interrupts 53: 596 s3c-ext eth0 60: 1 s3c-ext s3c-mci 70: 28 s3c-uart0 s3c2410-uart 71: 832 s3c-uart0 s3c2410-uart 79: 16 s3c-
[单片机]
基于仪表系统的嵌入式控制器的开发研究
1 引言 在仪器仪表迅速发展的同时,计算机和网络技术也在迅速发展,PC机已经从高速增长进入到平稳发展时期,嵌入式系统的出现和广泛应用,使计算机和网络进入了后PC时代,基于嵌入式智能仪表远程监控系统作为工业控制网络重要发展方向之一。而嵌入式控制器是能够实现智能仪表远程监控的关键设备,是工业控制仪表与Internet连接的桥梁。 2 控制器总体介绍 嵌入式智能仪表的结构及其与Internet的连接方案设计如图1。 图1基于嵌入式智能仪表的远程监控系统 嵌入式控制器是用于执行独立功能并具有以复杂方式处理数据能力的控制系统,它内置在工业仪表上,由三部分组成:高速处理器、嵌入式Web服务器和工业仪表
[单片机]
S3C2410中断处理
在介绍2410的中断处理之前,我们不得不先看看先把ARM的异常向量表(Exception Vectors),下面对异常向量表(Exception Vectors),做一个简单的介绍: ARM的异常向量表一般存放在0x00000000处,ARM920T能处理有7个异常,他们分别是:Reset,Undefined instruction,Software Interrupt,Abort (prefetch),Abort (data),IRQ,FIQ 下面是系统源码片段: _start: b Handle_Reset b HandleUndef b HandleSWI b HandlePrefetchAbort b Ha
[单片机]
基于ADS的S3C2410实现嵌入式串口通信
引言 ARM ADS全称为ARM Developer suite(ARM开发套件)。ADS的CodeWarrior集成开发环境(IDE)是基于Metrowerks CodeWarrior IDE4.2版本的,经过适当的裁剪以支持ADS工具链,为管理和开发项目提供了简单多样化的图形用户界面,用户可以使用ADS的CodeWarrior IDE为ARM和Thumb处理器开发用C、C++或ARM汇编语言的程序代码,缩短了用户开发项目代码的周期。ADS中包括3个调试器:AXD(ARM ExtendedDebugger)、ARMSD(ARM Symbo l i c Debugger)、ADW/ADU(Appl ICat ion Deb
[单片机]
基于嵌入式Linux平台的图像采集与传输设计
引言 随着嵌入式技术的迅猛发展和Linux在信息行业中的广泛应用,视频采集与传输系统作为远程视频监控、可视电话会议和工业自动控制领域的一项核心技术,近年来已经得到了飞速的发展。本文在基于嵌入式Linux系统平台上,采用USB摄像头捕捉视频信号,利用V4L内核应用编程接口函数,实现了视频连续帧图像的采集,并保存成文件的形式利用无线传输方式传输给接收端。这里着重讨论视频采集发送端的实现。 1 系统组成 1.1 统的硬件构成 本系统包括发送端和接收端2部分,两部分均采用Samsung公司生产的S3C2410处理器做硬件开发平台。S3C2410在片上集成了丰富的组件:分开的16 KB指令Cache和16 KB数据
[单片机]
基于Linux和S3C2410的嵌入式图象传输系统设计
1 引言 如何更好的获得监控现场的图象数据一直是棘手的一个问题,传统的方法是采用CCD摄象机获取现场的视频信息,这种方法易于实现,但成本较高。随着ARM系列处理器应用的越来越广和基于linux的嵌入式技术的迅速发展,利用linux自身带有的TCP/IP协议来实现远程监控、图象传输已成为可能。本文提出的正是一种这样的方法,利用市场上很常见的中星微系列的USB摄象头来得到现场的图象数据,利用linux内核中的Video4Linux编程接口函数采集图象,并把得到的图象通过Internet传输到上位机PC上,在PC上实现图象的保存和显示。 2 硬件系统设计原理 系统的硬件功能框图如图1所示,CPU采用的是三星公司的S3C2410。该
[应用]