历史上的今天
今天是: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 *~
===============================================================
史海拾趣
|
1、为什么我点击Tools-New Component的时候,没有元件导向功能啊? 答:我们的新元件导向器是通过Tools-Wizard Component来实现的,并非New Component这个命令,这个New Component命令是用来做那些不规则的元件的。 2、能不能将PCB库中初始设置 ...… 查看全部问答> |
|
看见一个朋友的博客里写着:将一些大的组件(如汉字)库放到user store(如SD卡、Flash等)来减少内核大小,这也是个好办法,NK加载时要到user store去加载,需要注意的是:在加载显示驱动前就要加载保存字体的存贮设备的驱动,否则中文字体不能加载。 ...… 查看全部问答> |
|
KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_I2CIrq, sizeof(UINT32), &g_I2CSysIntr, sizeof(UINT32), NULL) 可以从OAL请求一个SYSINTR值,然后通过IST执行相关中断 但是SYSINTR有SYSINTR_I2C,SYSINTR_TOUC,SYSINTR_SERIA....... 系统怎么 ...… 查看全部问答> |
|
我的代码如下: if(uVirKey == VK_NUMPAD0 ) { int i = GetKeyState(VK_MENU) ; if( i < 0 ) dosomething(); } 为什么不能截取组合键?谢谢!… 查看全部问答> |
|
各位网友,本人羞愧但是又高兴地告诉大家,我的LED应急灯制作成功了!!羞愧的是我完成的很晚,高兴的是终于达到制作要求。 首先要感谢的是SOSO琳子姐姐(实际按我的年龄该叫她侄女,既然网友都这么叫她,我也这么 ...… 查看全部问答> |
|
我用MOS管IRF9630做电源开关管,负载是M22模块(不知道大家用过这个吗?)!!! 当模块检测SIM卡时,MOS管输出电压很是不稳定!!!! 如果不带负载,开关管输出很稳定!!!!!!!!!!!!!!!!!!! 请DX们帮忙,是负载问题还是开关 ...… 查看全部问答> |
|
小弟数据结构学的不怎么好。 最近在搞SD卡的读写,我基本的读写还可以,但是搞FAT16文件系统的时候遇到了难题,就是怎么通过算法,在FDT表中查找文件并读 ...… 查看全部问答> |




