历史上的今天
返回首页

历史上的今天

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

正在发生

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

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;

    

    __asm__ __volatile__ (

        "cpsie i\n"

    );

 

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

    ICCICR_CPU0 = 1;

    ICCPMR_CPU0 =  0xff;  //Priority Unmask All Interrupt

    ICDDCR = 1;    

    

    //------ Watchdog IRQ ID is 75------------------

    ICDIPR18_CPU0 = ~(0xff << 24);// the Zero is Highest priority 

    ICDIPTR18_CPU0 = (1 << 24);     // for CPU0   , refer  PG815 

    ICDISER2_CPU0 =  (1 << 11);      // enable interrupt 0 --- SGI0 

    //---------- Configure WDT ----------------------

    // 200000000 / 128 / 256 = 6103,即频率6103

    WTCNT = 6103;    // 1秒钟减完

    WTDAT = 6103;    // WTCNT 1秒钟减完后把WTDAT值装入WTCNT中继续减

    WTCON = (1 << 2) | (3 << 3) | (1 << 5) | (0xff << 8) ; //启动看门狗

}

void do_irq(unsigned long regs[])

{

    printf("watchdog: wang wang wang ....\n");

    WTCLRINT = 0;

}

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   *~ 

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


推荐阅读

史海拾趣

AK-Nord_GmbH公司的发展小趣事

随着技术的成熟,AK-Nord_GmbH开始积极拓展市场。公司首先在欧洲地区建立了稳固的销售网络,并逐步向亚洲和北美市场扩张。在市场拓展的过程中,AK-Nord_GmbH积极与各大电子厂商建立合作伙伴关系,共同推出了一系列创新产品。这些合作伙伴关系不仅帮助公司打开了新的市场,还提升了其品牌影响力和市场份额。

ACP Optoelectronic Technology Co Ltd公司的发展小趣事

在发展过程中,ACP Optoelectronic Technology Co Ltd注重品牌建设和形象提升。公司加强品牌宣传和推广力度,通过媒体广告、网络宣传等多种方式提升品牌知名度和美誉度。同时,公司也注重客户服务和售后支持,以优质的产品和服务赢得客户的信任和支持。这些举措不仅提升了ACP Optoelectronic Technology Co Ltd的品牌形象,也为其长期发展奠定了坚实基础。


请注意,以上故事仅为虚构,旨在展示电子行业企业可能的发展路径和趋势。实际上,每个企业的发展历程都是独一无二的,受到市场环境、技术创新、管理决策等多种因素的影响。如需了解ACP Optoelectronic Technology Co Ltd的真实发展故事,建议查阅相关新闻报道或公司资料。

ACE [ACE Technology Co., Ltd.]公司的发展小趣事

为了进一步提升技术实力和市场份额,ACP Optoelectronic Technology Co Ltd积极寻求与其他企业的战略合作。公司先后与多家知名电子企业签订了技术合作协议,共同开发新产品,共享市场资源。这些合作不仅提升了ACP Optoelectronic Technology Co Ltd的技术水平,也为其带来了更多的商业机会,推动了公司的快速发展。

E-Mark Inc公司的发展小趣事

ABC公司专注于研发先进的驾驶辅助系统。为了确保产品的合规性和市场竞争力,ABC公司主动寻求E-Mark认证。在认证过程中,公司不断优化产品设计,提高产品性能,成功获得了E-Mark认证。凭借这一认证,ABC公司的产品在欧洲市场得到了广泛应用,公司也因此获得了技术革新的声誉和市场份额的扩大。

CANDD公司的发展小趣事

随着全球环保意识的提高,CANDD公司积极响应号召,开始践行绿色环保理念。公司投入大量资金研发环保型电子产品,并采用了更加环保的生产工艺和材料。同时,公司还加强了废弃电子产品的回收和处理工作,努力减少对环境的污染。这些举措不仅提升了公司的社会形象,还为公司赢得了更多消费者的支持。

全智景(Allvision)公司的发展小趣事

全智景公司自成立以来,一直致力于电子视觉技术的研发。早期,公司面临激烈的市场竞争和技术瓶颈,但全智景团队凭借坚韧不拔的精神,成功研发出了一款具有划时代意义的高清摄像头芯片。这款芯片以其出色的图像质量和稳定性,迅速获得了市场的认可,并推动了整个电子视觉行业的进步。这一技术突破不仅让全智景公司在市场上站稳了脚跟,也为公司后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

青越锋软件常见操作性问题---(PCB库)

1、为什么我点击Tools-New Component的时候,没有元件导向功能啊? 答:我们的新元件导向器是通过Tools-Wizard Component来实现的,并非New Component这个命令,这个New Component命令是用来做那些不规则的元件的。 2、能不能将PCB库中初始设置 ...…

查看全部问答>

新手报道,发几个教程

新手报道,不知道对大家有没有用,如果有用还会把其他杂七杂八的都传上 [ 本帖最后由 hdx 于 2009-7-12 13:21 编辑 ]…

查看全部问答>

急!!!怎么将大的组件放到user store里???

看见一个朋友的博客里写着:将一些大的组件(如汉字)库放到user store(如SD卡、Flash等)来减少内核大小,这也是个好办法,NK加载时要到user store去加载,需要注意的是:在加载显示驱动前就要加载保存字体的存贮设备的驱动,否则中文字体不能加载。 ...…

查看全部问答>

从OAL请求一个逻辑中断号

KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_I2CIrq, sizeof(UINT32), &g_I2CSysIntr, sizeof(UINT32), NULL) 可以从OAL请求一个SYSINTR值,然后通过IST执行相关中断 但是SYSINTR有SYSINTR_I2C,SYSINTR_TOUC,SYSINTR_SERIA....... 系统怎么 ...…

查看全部问答>

高手请进,如何获取 ALT 组合键 ?

我的代码如下: if(uVirKey == VK_NUMPAD0 ) { int i = GetKeyState(VK_MENU) ; if( i < 0 ) dosomething(); } 为什么不能截取组合键?谢谢!…

查看全部问答>

我的LED应急灯制作过程(4)-调试完成,交差!

各位网友,本人羞愧但是又高兴地告诉大家,我的LED应急灯制作成功了!!羞愧的是我完成的很晚,高兴的是终于达到制作要求。       首先要感谢的是SOSO琳子姐姐(实际按我的年龄该叫她侄女,既然网友都这么叫她,我也这么 ...…

查看全部问答>

【求助】请高手帮忙!!!!急!!!!!!

我用MOS管IRF9630做电源开关管,负载是M22模块(不知道大家用过这个吗?)!!! 当模块检测SIM卡时,MOS管输出电压很是不稳定!!!! 如果不带负载,开关管输出很稳定!!!!!!!!!!!!!!!!!!! 请DX们帮忙,是负载问题还是开关 ...…

查看全部问答>

关于SD卡FAT16文件系统的读写

        小弟数据结构学的不怎么好。         最近在搞SD卡的读写,我基本的读写还可以,但是搞FAT16文件系统的时候遇到了难题,就是怎么通过算法,在FDT表中查找文件并读 ...…

查看全部问答>