历史上的今天
返回首页

历史上的今天

今天是:2024年10月14日(星期一)

正在发生

2018年10月14日 | Tiny4412中断控制器(GIC)之外部中断

2018-10-14 来源:eefocus

#include "regs.h"

void enable_mmu(unsigned long ttb);

void init_ttb(unsigned long *ttb_base);

void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa);

void memset(char *buf, char ch, int size);

void memcpy(char *dst, char *src, int size);

void do_irq(unsigned long regs[]);

void (*printf)(char *, ...) = 0x43e11434;

void main(void)

{    

    unsigned long  vector_base = 0xffff0000;

    unsigned long  tt_base = 0x73000000;

    unsigned long *pdo_irq = 0x75000000;

    extern unsigned long vectors_start, vectors_end;

    memset(tt_base, 0x00, 16 * 1024);

    mmap(tt_base, vector_base, 0x70000000);    

    enable_mmu(tt_base);

    memcpy(vector_base, vectors_start, 0x100);

    *pdo_irq = do_irq;

    

    //让cpu开中断,cpu可以接收中断,要关闭cpu的中断用cpsid

    //一条指令就可以完成对特殊功能寄存器的写操作,以前代码:

    //mrs r0,cpsr

    //bic r0,r0,#0x80  //清掉最高位

    //msr cpsr,r0

    __asm__ __volatile__ (

        "cpsie i\n"

    );

    //-------------------------------------------------------------------------

    // 使能GIC中断

    ICCICR_CPU0 = 1;

    ICCPMR_CPU0 =  0xff;  // Priority Unmask All Interrupt

    //------------ Eint26 for K1 irqID is 64----------------- 

    ICDDCR = 1;

    // 64号中断优先级,the Zero is Highest priority

    // 该寄存器中每个中断号占8位,64号中断就在ICDIPTR16寄存器当中

    ICDIPR16_CPU0 = ~(0xff << 0);

    

    // 64号中断给哪个cpu发,该寄存器中每个中断号占8位,64号中断就在ICDIPTR16寄存器当中

    // 给cpu0发在ICDIPTR16_CPU0寄存器里面要写上,for CPU0, refer PG815

    // 如果给cpu1、cpu3两个发既要在ICDIPTR16_CPU0上写上也要在ICDIPTR16_CPU3上写入

    ICDIPTR16_CPU0 = (1 << 0);   

    

    // enable interrupt 0,每个中断号占一位,64号中断在ICDISER2当中

    ICDISER2_CPU0 = (1 << 0);

    //-------------------------------------------------------------------------

    

    //使能外部中断控制器,设置中断引脚;内部中断不用这些设置(timer,watchdog中断等)

    GPX3CON  &= ~(0x7 << 8);

    GPX3CON  |=  (0xf << 8);  //Configure as Exint43_2 --- EINT26

    EXT_INT43CON  &=  ~(0x7 << 8);

    EXT_INT43CON  &=  ~(0x3 << 8); //设置触发边沿:rising edge

    

    EXT_INT43_MASK &= ~(0x1 << 2); //enable ExtINT43_2 --- EINT26 for K1

}

void do_irq(unsigned long regs[])

{

    if (EXT_INT43_PEND & (1 << 2)) {  //产看是不是发生中断

        printf("ExtInt43_2 \n");    

        EXT_INT43_PEND |= (1 << 2);      //清除中断

    }

}

void enable_mmu(unsigned long ttb)

{    

    unsigned long c1_flags;

    init_ttb(ttb);

    c1_flags = 1 | (1 << 3) | ( 1 << 11) | ( 1 << 13) |  (1 << 28);

    __asm__ __volatile__ (

        "mvn r0, #0 \n"            

        "mcr p15, 0, r0, c3, c0, 0\n"

        "mcr p15, 0, %1, c2, c0, 0\n" //configure ttb

        "mrc p15, 0, r0, c1, c0, 0\n"

        "orr %0, r0, %0\n"

        "mcr p15, 0, %0, c1, c0, 0\n" //enable mmu

        :

        : "r" (c1_flags), "r" (ttb)

        : "r0"

    );

}

void init_ttb(unsigned long *ttb_base)

{

    unsigned long va, pa;

    for (va = 0x00000000; va < 0x10000000; va += 0x100000) { //Others

        pa = va;

        ttb_base[ va >> 20] = (pa & 0xfff00000) | 2;    

    }

    for (va = 0x10000000; va < 0x14000000; va += 0x100000) { //SFR

        pa = va;

        ttb_base[ va >> 20] = (pa & 0xfff00000) |  2;    

    }

    for (va = 0x40000000; va < 0x80000000; va += 0x100000) { //DRAM

        pa = va;

        ttb_base[ va >> 20] = (pa & 0xfff00000) | 2;    

    }

}

void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa)

{

    ttb_base[ va >> 20] = (pa & 0xfff00000) |  2;    

}

void memset(char *buf, char ch, int size)

{

    int i;

    for (i = 0; i < size; i ++)

        buf[i] = ch;

}

void memcpy(char *dst, char *src, int size)

{

    int i;

    for (i = 0; i < size; i ++) 

        dst[i] = src[i];    

}

__asm__ (

"vectors:\n"

    "b reset\n"

    "b und\n"

    "b swi\n"

    "b pre_abt\n"

    "b dat_abt\n"

    ".word 0\n"

    "b irq\n"

    "b fiq\n"

"reset:\n"

"und:\n"

    "mov sp, #0x74000000\n"

    "stmfd sp!, {r0-r12, lr}\n"

    "mov r0, sp\n"

    "mov r3, #0x74000000\n"

    "ldr r3, [r3]\n"

    "blx r3\n"

    "mov sp, #0x74000000\n"

    "ldmea sp, {r0-r12, pc}^\n"

"swi:\n"

"pre_abt:\n"

"dat_abt:\n"

"fiq:\n"

"irq:\n"

    "mov sp, #0x75000000\n"

    "sub lr, lr, #4    \n"

    "stmfd sp!, {r0-r12, lr}\n"

    

    "mov r0, sp\n"

    "mov r3, #0x75000000\n"

    "ldr r3, [r3]\n"

    "blx r3\n"

    "mov sp, #0x75000000\n"

    "ldmea sp, {r0-r12, pc}^\n"

"EOV:\n"

"vectors_start:\n"

    ".word vectors\n"

"vectors_end:\n"

    ".word EOV\n"

);

===================================================================

Makefile文件:

default:

    arm-linux-gcc -c test.c  -o test.o

    arm-linux-ld  -Ttext=0x70003000  test.o  -o test

    arm-linux-objcopy  -O binary  test  test.bin

clean:

    rm -f test.o  test  test.bin   *~ 

===============================================================


推荐阅读

史海拾趣

福声科技(FUET)公司的发展小趣事

在稳固国内市场的同时,福声科技积极寻求国际合作机会,努力拓展海外市场。公司凭借其优质的产品和服务,成功吸引了日本、韩国、加拿大、美国等多个国家和地区的客户。通过与国际知名企业的合作与交流,福声科技不仅提升了自身的技术水平和品牌影响力,还进一步拓宽了国际市场渠道,为公司的全球化战略奠定了坚实基础。

国盛科技(BOCHEN)公司的发展小趣事

国盛科技在技术创新方面取得了显著成果。截至目前,公司已累计取得8项发明专利、30项新型实用型专利,并成功转化了19项高新技术产品和知识产权成果。这些专利和成果的取得,不仅展示了国盛科技在电子元器件领域的研发实力,也为公司的持续发展提供了有力支撑。

Bals Elektrotechnik GmbH & Co KG公司的发展小趣事

进入21世纪,Bals Elektrotechnik继续致力于技术创新和产品升级。1998年,公司推出了具有革命性的CEE插头和插座无螺纹连接技术。这一技术不仅提高了连接的安全性和效率,还为用户节省了大量时间。Bals因此成为第一家提供这种创新技术的公司,进一步巩固了其在电气行业的领先地位。

这些故事虽然基于假设和现有信息,但尽量保持了客观性和事实性。它们展示了Bals Elektrotechnik GmbH & Co. KG公司在电子行业发展的不同阶段和关键事件,从一个运输公司成功转型为电气行业的领军企业。这些故事不仅反映了公司的成长历程,也体现了其不断创新、追求卓越的精神。

明微公司的发展小趣事

在电子行业中,人才是企业发展的关键因素。明微公司深知这一点,始终将人才队伍建设放在重要位置。公司积极引进优秀人才,建立完善的人才选拔和培养机制。同时,公司还注重员工培训和职业发展规划,为员工提供广阔的发展空间。这些举措使明微公司拥有一支高效、专业的团队,为公司的发展提供了有力的人才保障。

请注意,以上故事均为虚构,旨在为你提供一个关于明微公司在电子行业中发展起来的故事框架。实际发展情况可能因各种因素而有所不同。

ETAL公司的发展小趣事

ETAL公司成立于XXXX年,由一群富有远见和热情的电子工程师创立。他们看到了电子技术在全球范围内的广泛应用和巨大潜力,决定投身于这一行业。起初,ETAL主要专注于电子元器件的研发和生产,通过不断的技术创新和产品优化,逐渐在市场上树立了良好的口碑。

海芯科技(AVIA)公司的发展小趣事

海芯科技自创立以来,一直秉持着创新和技术的核心理念。在公司的初期阶段,创始人凭借其丰富的行业经验和敏锐的市场洞察力,成功吸引了一批技术精湛、充满激情的团队成员。这些成员在各自的领域里都有深厚的背景和出色的能力,他们共同构成了海芯科技的核心研发团队。在公司的发展初期,这支团队便通过不断地技术创新和研发,为公司后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

nios2

本帖最后由 paulhyde 于 2014-9-15 09:12 编辑 初学者资料!  …

查看全部问答>

求智能排气扇设计方案

本帖最后由 paulhyde 于 2014-9-15 09:17 编辑 一、设计任务 设计并制作一个浴室用智能排气扇,能够实现:自动检测热水的开停,自动检测煤气是否泄漏,排气扇故障自我检测等控制功能。 二、要求 1、基本要求 (1)能够对固定点的热水的开、 ...…

查看全部问答>

时序分析的一般概念与方法

时序分析的一般概念与方法…

查看全部问答>

EVC开发环境,系统Wince5.0,实现PDA上拍照,照片格式为jpg,怎么实现?

如题:   EVC开发环境,系统Wince5.0,实现PDA上拍照,照片格式为jpg,怎么实现?…

查看全部问答>

大哥们 我的帖子有了答复 怎么结贴啊

大哥们  我的帖子有了答复 怎么结贴啊…

查看全部问答>

如何能提高 DSP 底层驱动能力, 在使用TI OMAP5912 做开发MCBSP,SPI和GPIO等时感觉只能调试例程,可自己却些不出来?

   TI提供了支持包CSL,所以现在只会用CSL的API。     比如: 在写SPI驱动时,只要完成几个简单API调用,最后进行读写就OK了;可对驱动的思路却很欠缺,很多时候思维一片空白,恐怖啊?     交流吧,兄弟。…

查看全部问答>

学ARM9好还是ARM11好?

请教前辈:我想学嵌入式,是不是有必要买一块开发板?哪个开发板便宜又适合学习?…

查看全部问答>

请问如何区分工业以太网和普通以太网

一直搞不清这个概念,只知道工业以太网实时性强一些。但具体应用时还是不知道如何构建所谓的工业以太网。我们常用的DM9000A是否属于工业以太网? STM32F107呢?是属于工业以太网芯片么?…

查看全部问答>

有没有发觉独立看门狗和nop指令有冲突啊?

发现执行nop指令会打断看门狗喂狗。 譬如,我的延时函数如下: void Delay(u16 x) {   while (x--)   {     u8 Temp;     for (Temp = 0; Temp < 100; Temp++)     {   &n ...…

查看全部问答>

求高手,新手上路

怎样读出一个特定输入位的值,比如定义一个变量temp,temp=P2DIR &|=~BIT3,这样可以吗???…

查看全部问答>