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

📄 core.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
	.tim2		= TIM2_BCD,	.cntl		= CNTL_LCDTFT | CNTL_LCDVCOMP(1),	.bpp		= 16,};static struct clcd_panel sanyo_2_5_in = {	.mode		= {		.name		= "Sanyo QVGA Portrait",		.refresh	= 116,		.xres		= 240,		.yres		= 320,		.pixclock	= 100000,		.left_margin	= 20,		.right_margin	= 10,		.upper_margin	= 2,		.lower_margin	= 2,		.hsync_len	= 10,		.vsync_len	= 2,		.sync		= FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,		.vmode		= FB_VMODE_NONINTERLACED,	},	.width		= -1,	.height		= -1,	.tim2		= TIM2_IVS | TIM2_IHS | TIM2_IPC,	.cntl		= CNTL_LCDTFT | CNTL_LCDVCOMP(1),	.bpp		= 16,};static struct clcd_panel epson_2_2_in = {	.mode		= {		.name		= "Epson QCIF",		.refresh	= 390,		.xres		= 176,		.yres		= 220,		.pixclock	= 62500,		.left_margin	= 3,		.right_margin	= 2,		.upper_margin	= 1,		.lower_margin	= 0,		.hsync_len	= 3,		.vsync_len	= 2,		.sync		= 0,		.vmode		= FB_VMODE_NONINTERLACED,	},	.width		= -1,	.height		= -1,	.tim2		= TIM2_BCD | TIM2_IPC,	.cntl		= CNTL_LCDTFT | CNTL_LCDVCOMP(1),	.bpp		= 16,};/* * Detect which LCD panel is connected, and return the appropriate * clcd_panel structure.  Note: we do not have any information on * the required timings for the 8.4in panel, so we presently assume * VGA timings. */static struct clcd_panel *versatile_clcd_panel(void){	void __iomem *sys_clcd = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_CLCD_OFFSET;	struct clcd_panel *panel = &vga;	u32 val;	val = readl(sys_clcd) & SYS_CLCD_ID_MASK;	if (val == SYS_CLCD_ID_SANYO_3_8)		panel = &sanyo_3_8_in;	else if (val == SYS_CLCD_ID_SANYO_2_5)		panel = &sanyo_2_5_in;	else if (val == SYS_CLCD_ID_EPSON_2_2)		panel = &epson_2_2_in;	else if (val == SYS_CLCD_ID_VGA)		panel = &vga;	else {		printk(KERN_ERR "CLCD: unknown LCD panel ID 0x%08x, using VGA\n",			val);		panel = &vga;	}	return panel;}/* * Disable all display connectors on the interface module. */static void versatile_clcd_disable(struct clcd_fb *fb){	void __iomem *sys_clcd = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_CLCD_OFFSET;	u32 val;	val = readl(sys_clcd);	val &= ~SYS_CLCD_NLCDIOON | SYS_CLCD_PWR3V5SWITCH;	writel(val, sys_clcd);#ifdef CONFIG_MACH_VERSATILE_AB	/*	 * If the LCD is Sanyo 2x5 in on the IB2 board, turn the back-light off	 */	if (fb->panel == &sanyo_2_5_in) {		void __iomem *versatile_ib2_ctrl = __io_address(VERSATILE_IB2_CTRL);		unsigned long ctrl;		ctrl = readl(versatile_ib2_ctrl);		ctrl &= ~0x01;		writel(ctrl, versatile_ib2_ctrl);	}#endif}/* * Enable the relevant connector on the interface module. */static void versatile_clcd_enable(struct clcd_fb *fb){	void __iomem *sys_clcd = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_CLCD_OFFSET;	u32 val;	val = readl(sys_clcd);	val &= ~SYS_CLCD_MODE_MASK;	switch (fb->fb.var.green.length) {	case 5:		val |= SYS_CLCD_MODE_5551;		break;	case 6:		val |= SYS_CLCD_MODE_565_RLSB;		break;	case 8:		val |= SYS_CLCD_MODE_888;		break;	}	/*	 * Set the MUX	 */	writel(val, sys_clcd);	/*	 * And now enable the PSUs	 */	val |= SYS_CLCD_NLCDIOON | SYS_CLCD_PWR3V5SWITCH;	writel(val, sys_clcd);#ifdef CONFIG_MACH_VERSATILE_AB	/*	 * If the LCD is Sanyo 2x5 in on the IB2 board, turn the back-light on	 */	if (fb->panel == &sanyo_2_5_in) {		void __iomem *versatile_ib2_ctrl = __io_address(VERSATILE_IB2_CTRL);		unsigned long ctrl;		ctrl = readl(versatile_ib2_ctrl);		ctrl |= 0x01;		writel(ctrl, versatile_ib2_ctrl);	}#endif}static unsigned long framesize = SZ_1M;static int versatile_clcd_setup(struct clcd_fb *fb){	dma_addr_t dma;	fb->panel		= versatile_clcd_panel();	fb->fb.screen_base = dma_alloc_writecombine(&fb->dev->dev, framesize,						    &dma, GFP_KERNEL);	if (!fb->fb.screen_base) {		printk(KERN_ERR "CLCD: unable to map framebuffer\n");		return -ENOMEM;	}	fb->fb.fix.smem_start	= dma;	fb->fb.fix.smem_len	= framesize;	return 0;}static int versatile_clcd_mmap(struct clcd_fb *fb, struct vm_area_struct *vma){	return dma_mmap_writecombine(&fb->dev->dev, vma,				     fb->fb.screen_base,				     fb->fb.fix.smem_start,				     fb->fb.fix.smem_len);}static void versatile_clcd_remove(struct clcd_fb *fb){	dma_free_writecombine(&fb->dev->dev, fb->fb.fix.smem_len,			      fb->fb.screen_base, fb->fb.fix.smem_start);}static struct clcd_board clcd_plat_data = {	.name		= "Versatile",	.check		= clcdfb_check,	.decode		= clcdfb_decode,	.disable	= versatile_clcd_disable,	.enable		= versatile_clcd_enable,	.setup		= versatile_clcd_setup,	.mmap		= versatile_clcd_mmap,	.remove		= versatile_clcd_remove,};#define AACI_IRQ	{ IRQ_AACI, NO_IRQ }#define AACI_DMA	{ 0x80, 0x81 }#define MMCI0_IRQ	{ IRQ_MMCI0A,IRQ_SIC_MMCI0B }#define MMCI0_DMA	{ 0x84, 0 }#define KMI0_IRQ	{ IRQ_SIC_KMI0, NO_IRQ }#define KMI0_DMA	{ 0, 0 }#define KMI1_IRQ	{ IRQ_SIC_KMI1, NO_IRQ }#define KMI1_DMA	{ 0, 0 }/* * These devices are connected directly to the multi-layer AHB switch */#define SMC_IRQ		{ NO_IRQ, NO_IRQ }#define SMC_DMA		{ 0, 0 }#define MPMC_IRQ	{ NO_IRQ, NO_IRQ }#define MPMC_DMA	{ 0, 0 }#define CLCD_IRQ	{ IRQ_CLCDINT, NO_IRQ }#define CLCD_DMA	{ 0, 0 }#define DMAC_IRQ	{ IRQ_DMAINT, NO_IRQ }#define DMAC_DMA	{ 0, 0 }/* * These devices are connected via the core APB bridge */#define SCTL_IRQ	{ NO_IRQ, NO_IRQ }#define SCTL_DMA	{ 0, 0 }#define WATCHDOG_IRQ	{ IRQ_WDOGINT, NO_IRQ }#define WATCHDOG_DMA	{ 0, 0 }#define GPIO0_IRQ	{ IRQ_GPIOINT0, NO_IRQ }#define GPIO0_DMA	{ 0, 0 }#define GPIO1_IRQ	{ IRQ_GPIOINT1, NO_IRQ }#define GPIO1_DMA	{ 0, 0 }#define RTC_IRQ		{ IRQ_RTCINT, NO_IRQ }#define RTC_DMA		{ 0, 0 }/* * These devices are connected via the DMA APB bridge */#define SCI_IRQ		{ IRQ_SCIINT, NO_IRQ }#define SCI_DMA		{ 7, 6 }#define UART0_IRQ	{ IRQ_UARTINT0, NO_IRQ }#define UART0_DMA	{ 15, 14 }#define UART1_IRQ	{ IRQ_UARTINT1, NO_IRQ }#define UART1_DMA	{ 13, 12 }#define UART2_IRQ	{ IRQ_UARTINT2, NO_IRQ }#define UART2_DMA	{ 11, 10 }#define SSP_IRQ		{ IRQ_SSPINT, NO_IRQ }#define SSP_DMA		{ 9, 8 }/* FPGA Primecells */AMBA_DEVICE(aaci,  "fpga:04", AACI,     NULL);AMBA_DEVICE(mmc0,  "fpga:05", MMCI0,    &mmc0_plat_data);AMBA_DEVICE(kmi0,  "fpga:06", KMI0,     NULL);AMBA_DEVICE(kmi1,  "fpga:07", KMI1,     NULL);/* DevChip Primecells */AMBA_DEVICE(smc,   "dev:00",  SMC,      NULL);AMBA_DEVICE(mpmc,  "dev:10",  MPMC,     NULL);AMBA_DEVICE(clcd,  "dev:20",  CLCD,     &clcd_plat_data);AMBA_DEVICE(dmac,  "dev:30",  DMAC,     NULL);AMBA_DEVICE(sctl,  "dev:e0",  SCTL,     NULL);AMBA_DEVICE(wdog,  "dev:e1",  WATCHDOG, NULL);AMBA_DEVICE(gpio0, "dev:e4",  GPIO0,    NULL);AMBA_DEVICE(gpio1, "dev:e5",  GPIO1,    NULL);AMBA_DEVICE(rtc,   "dev:e8",  RTC,      NULL);AMBA_DEVICE(sci0,  "dev:f0",  SCI,      NULL);AMBA_DEVICE(uart0, "dev:f1",  UART0,    NULL);AMBA_DEVICE(uart1, "dev:f2",  UART1,    NULL);AMBA_DEVICE(uart2, "dev:f3",  UART2,    NULL);AMBA_DEVICE(ssp0,  "dev:f4",  SSP,      NULL);static struct amba_device *amba_devs[] __initdata = {	&dmac_device,	&uart0_device,	&uart1_device,	&uart2_device,	&smc_device,	&mpmc_device,	&clcd_device,	&sctl_device,	&wdog_device,	&gpio0_device,	&gpio1_device,	&rtc_device,	&sci0_device,	&ssp0_device,	&aaci_device,	&mmc0_device,	&kmi0_device,	&kmi1_device,};#ifdef CONFIG_LEDS#define VA_LEDS_BASE (__io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_LED_OFFSET)static void versatile_leds_event(led_event_t ledevt){	unsigned long flags;	u32 val;	local_irq_save(flags);	val = readl(VA_LEDS_BASE);	switch (ledevt) {	case led_idle_start:		val = val & ~VERSATILE_SYS_LED0;		break;	case led_idle_end:		val = val | VERSATILE_SYS_LED0;		break;	case led_timer:		val = val ^ VERSATILE_SYS_LED1;		break;	case led_halted:		val = 0;		break;	default:		break;	}	writel(val, VA_LEDS_BASE);	local_irq_restore(flags);}#endif	/* CONFIG_LEDS */void __init versatile_init(void){	int i;	clk_register(&versatile_clcd_clk);	platform_device_register(&versatile_flash_device);	platform_device_register(&smc91x_device);	for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {		struct amba_device *d = amba_devs[i];		amba_device_register(d, &iomem_resource);	}#ifdef CONFIG_LEDS	leds_event = versatile_leds_event;#endif}/* * Where is the timer (VA)? */#define TIMER0_VA_BASE		 __io_address(VERSATILE_TIMER0_1_BASE)#define TIMER1_VA_BASE		(__io_address(VERSATILE_TIMER0_1_BASE) + 0x20)#define TIMER2_VA_BASE		 __io_address(VERSATILE_TIMER2_3_BASE)#define TIMER3_VA_BASE		(__io_address(VERSATILE_TIMER2_3_BASE) + 0x20)#define VA_IC_BASE		 __io_address(VERSATILE_VIC_BASE) /* * How long is the timer interval? */#define TIMER_INTERVAL	(TICKS_PER_uSEC * mSEC_10)#if TIMER_INTERVAL >= 0x100000#define TIMER_RELOAD	(TIMER_INTERVAL >> 8)#define TIMER_DIVISOR	(TIMER_CTRL_DIV256)#define TICKS2USECS(x)	(256 * (x) / TICKS_PER_uSEC)#elif TIMER_INTERVAL >= 0x10000#define TIMER_RELOAD	(TIMER_INTERVAL >> 4)		/* Divide by 16 */#define TIMER_DIVISOR	(TIMER_CTRL_DIV16)#define TICKS2USECS(x)	(16 * (x) / TICKS_PER_uSEC)#else#define TIMER_RELOAD	(TIMER_INTERVAL)#define TIMER_DIVISOR	(TIMER_CTRL_DIV1)#define TICKS2USECS(x)	((x) / TICKS_PER_uSEC)#endif/* * Returns number of ms since last clock interrupt.  Note that interrupts * will have been disabled by do_gettimeoffset() */static unsigned long versatile_gettimeoffset(void){	unsigned long ticks1, ticks2, status;	/*	 * Get the current number of ticks.  Note that there is a race	 * condition between us reading the timer and checking for	 * an interrupt.  We get around this by ensuring that the	 * counter has not reloaded between our two reads.	 */	ticks2 = readl(TIMER0_VA_BASE + TIMER_VALUE) & 0xffff;	do {		ticks1 = ticks2;		status = __raw_readl(VA_IC_BASE + VIC_IRQ_RAW_STATUS);		ticks2 = readl(TIMER0_VA_BASE + TIMER_VALUE) & 0xffff;	} while (ticks2 > ticks1);	/*	 * Number of ticks since last interrupt.	 */	ticks1 = TIMER_RELOAD - ticks2;	/*	 * Interrupt pending?  If so, we've reloaded once already.	 *	 * FIXME: Need to check this is effectively timer 0 that expires	 */	if (status & IRQMASK_TIMERINT0_1)		ticks1 += TIMER_RELOAD;	/*	 * Convert the ticks to usecs	 */	return TICKS2USECS(ticks1);}/* * IRQ handler for the timer */static irqreturn_t versatile_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs){	write_seqlock(&xtime_lock);	// ...clear the interrupt	writel(1, TIMER0_VA_BASE + TIMER_INTCLR);	timer_tick(regs);	write_sequnlock(&xtime_lock);	return IRQ_HANDLED;}static struct irqaction versatile_timer_irq = {	.name		= "Versatile Timer Tick",	.flags		= SA_INTERRUPT | SA_TIMER,	.handler	= versatile_timer_interrupt,};/* * Set up timer interrupt, and return the current time in seconds. */static void __init versatile_timer_init(void){	u32 val;	/* 	 * set clock frequency: 	 *	VERSATILE_REFCLK is 32KHz	 *	VERSATILE_TIMCLK is 1MHz	 */	val = readl(__io_address(VERSATILE_SCTL_BASE));	writel((VERSATILE_TIMCLK << VERSATILE_TIMER1_EnSel) |	       (VERSATILE_TIMCLK << VERSATILE_TIMER2_EnSel) | 	       (VERSATILE_TIMCLK << VERSATILE_TIMER3_EnSel) |	       (VERSATILE_TIMCLK << VERSATILE_TIMER4_EnSel) | val,	       __io_address(VERSATILE_SCTL_BASE));	/*	 * Initialise to a known state (all timers off)	 */	writel(0, TIMER0_VA_BASE + TIMER_CTRL);	writel(0, TIMER1_VA_BASE + TIMER_CTRL);	writel(0, TIMER2_VA_BASE + TIMER_CTRL);	writel(0, TIMER3_VA_BASE + TIMER_CTRL);	writel(TIMER_RELOAD, TIMER0_VA_BASE + TIMER_LOAD);	writel(TIMER_RELOAD, TIMER0_VA_BASE + TIMER_VALUE);	writel(TIMER_DIVISOR | TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC |	       TIMER_CTRL_IE, TIMER0_VA_BASE + TIMER_CTRL);	/* 	 * Make irqs happen for the system timer	 */	setup_irq(IRQ_TIMERINT0_1, &versatile_timer_irq);}struct sys_timer versatile_timer = {	.init		= versatile_timer_init,	.offset		= versatile_gettimeoffset,};

⌨️ 快捷键说明

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