www.pudn.com > ucosii_core.rar > clock.h, change:2007-06-12,size:3815b


#ifndef __ASM_JZ47XX_CLOCK_H__
#define __ASM_JZ47XX_CLOCK_H__

/*
 * System clock structure
 */
struct sys_clock {
	unsigned int iclk;
	unsigned int sclk;
	unsigned int mclk;
	unsigned int pclk;
	unsigned int devclk;
	unsigned int rtcclk;
	unsigned int uartclk;
	unsigned int lcdclk;
	unsigned int pixclk;
	unsigned int usbclk;
	unsigned int i2sclk;
	unsigned int mscclk;
};

extern struct sys_clock jz_clocks;

#define JZ_EXTAL		12000000
#define JZ_EXTAL2		32768

static __inline__ unsigned int __cpm_get_pllout(void)
{
	unsigned int nf, nr, no, pllout;
	unsigned long plcr = REG_CPM_PLCR1;
	unsigned long od[4] = {1, 2, 2, 4};
	if (plcr & CPM_PLCR1_PLL1EN) {
		nf = (plcr & CPM_PLCR1_PLL1FD_MASK) >> CPM_PLCR1_PLL1FD_BIT;
		nr = (plcr & CPM_PLCR1_PLL1RD_MASK) >> CPM_PLCR1_PLL1RD_BIT;
		no = od[((plcr & CPM_PLCR1_PLL1OD_MASK) >> CPM_PLCR1_PLL1OD_BIT)];
		pllout = (JZ_EXTAL) / ((nr+2) * no) * (nf+2);
	} else
		pllout = JZ_EXTAL;
	return pllout;
}

static __inline__ unsigned int __cpm_get_iclk(void)
{
	unsigned int iclk;
	int div[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32};
	unsigned long cfcr = REG_CPM_CFCR;
	unsigned long plcr = REG_CPM_PLCR1;
	if (plcr & CPM_PLCR1_PLL1EN)
		iclk = __cpm_get_pllout() /
		       div[(cfcr & CPM_CFCR_IFR_MASK) >> CPM_CFCR_IFR_BIT];
	else
		iclk = JZ_EXTAL;
	return iclk;
}

static __inline__ unsigned int __cpm_get_sclk(void)
{
	unsigned int sclk;
	int div[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32};
	unsigned long cfcr = REG_CPM_CFCR;
	unsigned long plcr = REG_CPM_PLCR1;
	if (plcr & CPM_PLCR1_PLL1EN)
		sclk = __cpm_get_pllout() /
		       div[(cfcr & CPM_CFCR_SFR_MASK) >> CPM_CFCR_SFR_BIT];
	else
		sclk = JZ_EXTAL;
	return sclk;
}

static __inline__ unsigned int __cpm_get_mclk(void)
{
	unsigned int mclk;
	int div[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32};
	unsigned long cfcr = REG_CPM_CFCR;
	unsigned long plcr = REG_CPM_PLCR1;
	if (plcr & CPM_PLCR1_PLL1EN)
		mclk = __cpm_get_pllout() /
		       div[(cfcr & CPM_CFCR_MFR_MASK) >> CPM_CFCR_MFR_BIT];
	else
		mclk = JZ_EXTAL;
	return mclk;
}

static __inline__ unsigned int __cpm_get_pclk(void)
{
	unsigned int devclk;
	int div[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32};
	unsigned long cfcr = REG_CPM_CFCR;
	unsigned long plcr = REG_CPM_PLCR1;
	if (plcr & CPM_PLCR1_PLL1EN)
		devclk = __cpm_get_pllout() /
			 div[(cfcr & CPM_CFCR_PFR_MASK) >> CPM_CFCR_PFR_BIT];
	else
		devclk = JZ_EXTAL;
	return devclk;
}

static __inline__ unsigned int __cpm_get_lcdclk(void)
{
	unsigned int lcdclk;
	int div[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32};
	unsigned long cfcr = REG_CPM_CFCR;
	unsigned long plcr = REG_CPM_PLCR1;
	if (plcr & CPM_PLCR1_PLL1EN)
		lcdclk = __cpm_get_pllout() /
			 div[(cfcr & CPM_CFCR_LFR_MASK) >> CPM_CFCR_LFR_BIT];
	else
		lcdclk = JZ_EXTAL;
	return lcdclk;
}

static __inline__ unsigned int __cpm_get_pixclk(void)
{
	unsigned int pixclk;
	unsigned long cfcr2 = REG_CPM_CFCR2;
	pixclk = __cpm_get_pllout() / (cfcr2 + 1);
	return pixclk;
}

static __inline__ unsigned int __cpm_get_devclk(void)
{
	return 12000000;
}

static __inline__ unsigned int __cpm_get_rtcclk(void)
{
	return 32768;
}

static __inline__ unsigned int __cpm_get_uartclk(void)
{
	return 12000000;
}

static __inline__ unsigned int __cpm_get_usbclk(void)
{
	unsigned int usbclk;
	unsigned long cfcr = REG_CPM_CFCR;
	if (cfcr & CPM_CFCR_MSC)
		usbclk = 48000000;
	else
		usbclk = __cpm_get_pllout() /
			(((cfcr &CPM_CFCR_UFR_MASK) >> CPM_CFCR_UFR_BIT) + 1);
	return usbclk;
}

static __inline__ unsigned int __cpm_get_i2sclk(void)
{
	unsigned int i2sclk;
	unsigned long cfcr = REG_CPM_CFCR;
	i2sclk = __cpm_get_pllout() /
		((cfcr & CPM_CFCR_I2S) ? 2: 1);
	return i2sclk;
}

static __inline__ unsigned int __cpm_get_mscclk(void)
{
	if (REG_CPM_CFCR & CPM_CFCR_I2S)
		return 24576000;
	else
		return 19169200;
}

#endif /* __ASM_JZ47XX_CLOCK_H__ */