system.c

来自「一个基于三星S3C2413的全部驱动程序」· C语言 代码 · 共 61 行

C
61
字号
#include "stdio.h"
#include "Option.h"
#include "2413addr.h"


//===========================[ SYSTEM ]===================================================

static int delayLoopCount;

unsigned int MPLL;
unsigned int ARMCLK, HCLK, PCLK;
unsigned int ARMCLKdiv, HCLKdiv, PCLKdiv;

void SystemCLK( void)
{
	unsigned int mdiv, pdiv, sdiv;

	mdiv = (rMPLLCON>>12)&0xff;
	pdiv = (rMPLLCON>>4)&0x3f;
	sdiv = (rMPLLCON&0x3);

	MPLL = (2*(mdiv+8)*FIN) / (pdiv+2);
	MPLL >>= sdiv;

	ARMCLKdiv	=	(rCLKDIVN>>3)&0x1;
	HCLKdiv		=	rCLKDIVN&0x3;
	PCLKdiv		=	(rCLKDIVN>>2)&0x1;

	ARMCLK	=	MPLL >> ARMCLKdiv;
	HCLK	=	ARMCLK / (HCLKdiv+1);
	PCLK	=	HCLK >> PCLKdiv;
}
//===========================[ SYSTEM ]===================================================

static int delayLoopCount;

void Delay(int time)
{
      // time=0: adjust the Delay function by WatchDog timer.
      // time>0: the number of loop time
      // resolution of time is 100us.
    int i,adjust=0;
    if(time==0) {
        time   = 200;
        adjust = 1;
        delayLoopCount = 400;
            //PCLK/1M,Watch-dog disable,1/64,interrupt disable,reset disable
        rWTCON = ((PCLK/1000000-1)<<8)|(2<<3); 
        rWTDAT = 0xffff;                              //for first update
        rWTCNT = 0xffff;                              //resolution=64us @any PCLK 
        rWTCON = ((PCLK/1000000-1)<<8)|(2<<3)|(1<<5); //Watch-dog timer start
    }
    for(;time>0;time--)
        for(i=0;i<delayLoopCount;i++);
    if(adjust==1) {
        rWTCON = ((PCLK/1000000-1)<<8)|(2<<3);   //Watch-dog timer stop
        i = 0xffff - rWTCNT;                     // 1count->64us, 200*400 cycle runtime = 64*i us
        //delayLoopCount = 8000000/(i*64);         //200*400:64*i=1*x:100 -> x=80000*100/(64*i)   
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?