⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cerf.c

📁 上传linux-jx2410的源代码
💻 C
字号:
/* *  linux/arch/arm/mach-pxa/cerf.c *   *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License version 2 as *  published by the Free Software Foundation. */#include <linux/init.h>#include <linux/major.h>#include <linux/fs.h>#include <linux/interrupt.h>#include <linux/sched.h>#include <asm/types.h>#include <asm/setup.h>#include <asm/memory.h>#include <asm/mach-types.h>#include <asm/hardware.h>#include <asm/irq.h>#include <asm/mach/arch.h>#include <asm/mach/map.h>#include <asm/mach/irq.h>#include <asm/io.h>#include <asm/arch/irq.h>#include "generic.h"/* * Set this to zero to remove all the debug statements via * dead code elimination. */#define DEBUGGING       1#if DEBUGGINGstatic unsigned int cerf_debug = DEBUGGING;#else#define cerf_debug       0#endifstatic void __init cerf_init_irq(void){	pxa_init_irq();	if( cerf_debug > 1)	{#if 0		GPDR0 = 0xc05b9130;		GPDR1 = 0xfcffab82;		GPDR2 = 0x0001ffff;#endif		printk(KERN_INFO "Pin directions:\n");		printk(KERN_INFO "GPDR0 0x%08x\n", GPDR0);		printk(KERN_INFO "GPDR1 0x%08x\n", GPDR1);		printk(KERN_INFO "GPDR2 0x%08x\n", GPDR2);		printk(KERN_INFO "Pin State:\n");		printk(KERN_INFO "GPLR0 0x%08x\n", GPLR0);		printk(KERN_INFO "GPLR1 0x%08x\n", GPLR1);		printk(KERN_INFO "GPLR2 0x%08x\n", GPLR2);		printk(KERN_INFO "Rising Edge:\n");		printk(KERN_INFO "GRER0 0x%08x\n", GRER0);		printk(KERN_INFO "GRER1 0x%08x\n", GRER1);		printk(KERN_INFO "GRER2 0x%08x\n", GRER2);		printk(KERN_INFO "Falling Edge:\n");		printk(KERN_INFO "GFER0 0x%08x\n", GFER0);		printk(KERN_INFO "GFER1 0x%08x\n", GFER1);		printk(KERN_INFO "GFER2 0x%08x\n", GFER2);	}	/* set_GPIO_IRQ_edge has to be called before an irq can be requested */        set_GPIO_IRQ_edge(  0, GPIO_FALLING_EDGE); /* CPLD               */#ifdef CONFIG_PXA_CERF_PDA        set_GPIO_IRQ_edge(  2, GPIO_RISING_EDGE);  /* UART B Interrupt   */        set_GPIO_IRQ_edge(  3, GPIO_RISING_EDGE);  /* UART A Interrupt   */        set_GPIO_IRQ_edge( 32, GPIO_RISING_EDGE);  /* UCB1400 Interrupt  */#endif        set_GPIO_IRQ_edge( 14, GPIO_FALLING_EDGE); /* PCMCIA Card Detect */        set_GPIO_IRQ_edge( 21, GPIO_RISING_EDGE);  /* Ethernet Interrupt */}static int __init cerf_init(void){	/*	 * All of the code that was here was SA1111 init code	 * which we do not have.	 */	return 0;}__initcall(cerf_init);static void __initfixup_cerf(struct machine_desc *desc, struct param_struct *params,		char **cmdline, struct meminfo *mi){	SET_BANK (0, CERF_RAM_BASE, CERF_RAM_SIZE);	mi->nr_banks      = 1;#if 0 // Enable this stuff if you plan on not using jffs2	setup_ramdisk (1, 0, 0, 8192);	setup_initrd (__phys_to_virt(0xa1000000), 4*1024*1024);	ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);#endif}/* * IO map for the devices. */static struct map_desc cerf_io_desc[] __initdata = { /* virtual           physical          length            domain     r  w  c  b */  { CERF_FLASH_BASE , CERF_FLASH_PHYS , CERF_FLASH_SIZE , DOMAIN_IO, 0, 1, 0, 0 },  { CERF_ETH_BASE   , CERF_ETH_PHYS   , CERF_ETH_SIZE   , DOMAIN_IO, 0, 1, 0, 0 },#ifdef CONFIG_PXA_CERF_PDA  { CERF_BT_BASE    , CERF_BT_PHYS    , CERF_BT_SIZE    , DOMAIN_IO, 0, 1, 0, 0 },  { CERF_SERIAL_BASE, CERF_SERIAL_PHYS, CERF_SERIAL_SIZE, DOMAIN_IO, 0, 1, 0, 0 },  { CERF_CPLD_BASE  , CERF_CPLD_PHYS  , CERF_CPLD_SIZE  , DOMAIN_IO, 0, 1, 0, 0 },#endif  LAST_DESC};/* * Show memory, run, turbo frequency settings. */static void cerf_show_freqs( void){#define BASE_CLOCK	3686400#define MAX_MEM_MULT	5	static int mem_mult[] = { 0, 27, 32, 36, 40, 45 };#define MAX_RMTM_MULT	7	static int rmtm_mult[] = { 0, 0, 2, 3, 4, 0, 6, 0 }; //divide by 2 later#define MAX_MFRM_MULT	3	static int mfrm_mult[] = { 0, 1, 2, 0};	int cccr = CCCR;	int n, m, l;	int mem_freq;	int rm_freq;	int tm_freq;        int p14val; 	n = (cccr & CCCR_N_MASK) >> 7;	m = (cccr & CCCR_M_MASK) >> 5;	l =  cccr & CCCR_L_MASK;	if( l > MAX_MEM_MULT)	{	    printk(KERN_INFO "cerf.c: Unknown memory freq multiplier.\n");	    return;	}	if( n > MAX_RMTM_MULT)	{	    printk(KERN_INFO "cerf.c: Unknown run-mode to turbo-mode freq multiplier.\n");	    return;	}	if( m > MAX_MFRM_MULT)	{	    printk(KERN_INFO "cerf.c: Unknown memory to run-mode freq multiplier.\n");	    return;	}	mem_freq = BASE_CLOCK * mem_mult[l]; 	rm_freq  = mem_freq * mfrm_mult[m];	tm_freq  = rm_freq * rmtm_mult[n]/2;		printk(KERN_INFO "Memory freq     = %d Mhz\n", mem_freq/1000000);	printk(KERN_INFO "Run mode freq   = %d Mhz\n", rm_freq/1000000);	printk(KERN_INFO "Turbo mode freq = %d Mhz\n", tm_freq/1000000);        asm("mrc%?   p14, 0, %0, c6, c0" : "=r" (p14val));	printk(KERN_INFO "Turbo mode %s.\n", p14val&0x01 ? "on" : "off");}static void __init cerf_map_io(void){	pxa_map_io();	iotable_init(cerf_io_desc);	if( cerf_debug) cerf_show_freqs();		if( cerf_debug > 1)	{		printk(KERN_INFO "origMCS0 = 0x%08x\n", MSC0);		printk(KERN_INFO "origMCS1 = 0x%08x\n", MSC1);		printk(KERN_INFO "origMCS2 = 0x%08x\n", MSC2);	}	/* setup memory timing for CS0/1 */        MSC0 = MSC_CS(0, MSC_RBUFF(MSC_RBUFF_SLOW) | 			 MSC_RRR(7) |			 MSC_RDN(15) |			 MSC_RDF(15) |			 MSC_RBW(0) |			 MSC_RT(0)) |#ifdef CONFIG_PXA_CERF_PDA               MSC_CS(1, MSC_RBUFF(MSC_RBUFF_SLOW) | 			 MSC_RRR(7) |			 MSC_RDN(15) |			 MSC_RDF(15) |			 MSC_RBW(1) |			 MSC_RT(0));#elif defined(CONFIG_PXA_CERF_BOARD)               MSC_CS(1, MSC_RBUFF(MSC_RBUFF_SLOW) | 			 MSC_RRR(1) |			 MSC_RDN(2) |			 MSC_RDF(4) |			 MSC_RBW(0) |			 MSC_RT(4));#endif	printk(KERN_INFO "MCS0 = 0x%08x\n", MSC0);	/* setup memory timing for CS2/3 */        MSC1 = MSC_CS(2, MSC_RBUFF(MSC_RBUFF_SLOW) | 			 MSC_RRR(5) |			 MSC_RDN(10) |			 MSC_RDF(10) |			 MSC_RBW(1) |			 MSC_RT(0)) |               MSC_CS(3, MSC_RBUFF(MSC_RBUFF_SLOW) | 			 MSC_RRR(5) |			 MSC_RDN(10) |			 MSC_RDF(10) |			 MSC_RBW(1) |			 MSC_RT(0));	printk(KERN_INFO "MCS1 = 0x%08x\n", MSC1);	/* setup memory timing for CS4/5 */        MSC2 = MSC_CS(4, MSC_RBUFF(MSC_RBUFF_SLOW) | 			 MSC_RRR(2) |			 MSC_RDN(4) |			 MSC_RDF(4) |			 MSC_RBW(1) |			 MSC_RT(0)) |               MSC_CS(5, MSC_RBUFF(MSC_RBUFF_SLOW) | 			 MSC_RRR(2) |			 MSC_RDN(4) |			 MSC_RDF(4) |			 MSC_RBW(1) |			 MSC_RT(0));	printk(KERN_INFO "MCS2 = 0x%08x\n", MSC2);#ifdef CONFIG_SOUND_PXA_AC97	printk(KERN_INFO "Enabling sound amp for pxa cerf pda.\n");        outw( CERF_PDA_SOUND_ENABLE, CERF_CPLD_BASE+CERF_PDA_CPLD_SOUND_ENA);#endif#ifdef CONFIG_FB_PXA	printk(KERN_INFO "Setting LCD to brightness to %d/15\n", CERF_PDA_DEFAULT_BRIGHTNESS);	outw( CERF_PDA_DEFAULT_BRIGHTNESS, CERF_CPLD_BASE+CERF_PDA_CPLD_BRIGHTNESS);#endif#ifdef CONFIG_IRDA	/* Enable IrDA UART (SIR)*/	CKEN |= CKEN5_STUART;	/* We want to get our goods from the STUART */	set_GPIO_mode(GPIO46_STRXD_MD);	set_GPIO_mode(GPIO47_STTXD_MD);	/* make sure FIR ICP is off */	ICCR0 = 0;	/* configure STUART to for SIR	 * NOTE: RCVEIR and XMITIR must not be set at the same time!	 * Start with receive in IR mode, and switch transmit to IR only	 * when we need to send something in serial driver.	 */	STISR = IrSR_IR_RECEIVE_ON;#endif#if 0	/* Connect FIR ICP to GPIO pins */	CKEN |= CKEN13_FICP;	set_GPIO_mode(GPIO46_ICPRXD_MD);	set_GPIO_mode(GPIO47_ICPTXD_MD);	ICCR0 = 0x1 | 0x18; //ICP unit enable#endif#if 0	/* Enable BT UART */	CKEN |= CKEN7_BTUART;	set_GPIO_mode(GPIO42_BTRXD_MD);	set_GPIO_mode(GPIO43_BTTXD_MD);	set_GPIO_mode(GPIO44_BTCTS_MD);	set_GPIO_mode(GPIO45_BTRTS_MD);#endif	if( cerf_debug > 1)	{		printk(KERN_INFO "GPDR1 0x%08x\n", GPDR1);		printk(KERN_INFO "GPLR1 0x%08x\n", GPLR1);		printk(KERN_INFO "GAFR1_L 0x%08x\n", GAFR1_L);		printk(KERN_INFO "CKEN  = 0x%08x\n", CKEN);		printk(KERN_INFO "ICCR0 = 0x%08x\n", ICCR0);		printk(KERN_INFO "STISR = 0x%08x\n", STISR);	}}MACHINE_START(PXA_CERF, "CerfBoard PXA Reference Board")	MAINTAINER("Intrinsyc Software Inc.")	BOOT_MEM(0xa0000000, 0x40000000, 0xfc000000)	BOOT_PARAMS(0xa0000100)	FIXUP(fixup_cerf)	MAPIO(cerf_map_io)	INITIRQ(cerf_init_irq)MACHINE_END

⌨️ 快捷键说明

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