lubbock.c

来自「优龙2410linux2.6.8内核源代码」· C语言 代码 · 共 586 行

C
586
字号
/* *  linux/arch/arm/mach-pxa/lubbock.c * *  Support for the Intel DBPXA250 Development Platform. * *  Author:	Nicolas Pitre *  Created:	Jun 15, 2001 *  Copyright:	MontaVista Software Inc. * *  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/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/device.h>#include <linux/major.h>#include <linux/fb.h>#include <linux/interrupt.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/arch/lubbock.h>#include <asm/arch/udc.h>#include <asm/arch/pxafb.h>#include <asm/hardware/sa1111.h>#include "generic.h"#ifndef	CONFIG_ARCH_FS_PXA255void lubbock_set_misc_wr(unsigned int mask, unsigned int set){	unsigned long flags;	local_irq_save(flags);	LUB_MISC_WR = (LUB_MISC_WR & ~mask) | (set & mask);	local_irq_restore(flags);}EXPORT_SYMBOL(lubbock_set_misc_wr);static unsigned long lubbock_irq_enabled;static void lubbock_mask_irq(unsigned int irq){	int lubbock_irq = (irq - LUBBOCK_IRQ(0));	LUB_IRQ_MASK_EN = (lubbock_irq_enabled &= ~(1 << lubbock_irq));}static void lubbock_unmask_irq(unsigned int irq){	int lubbock_irq = (irq - LUBBOCK_IRQ(0));	/* the irq can be acknowledged only if deasserted, so it's done here */	LUB_IRQ_SET_CLR &= ~(1 << lubbock_irq);	LUB_IRQ_MASK_EN = (lubbock_irq_enabled |= (1 << lubbock_irq));}static struct irqchip lubbock_irq_chip = {	.ack		= lubbock_mask_irq,	.mask		= lubbock_mask_irq,	.unmask		= lubbock_unmask_irq,};static void lubbock_irq_handler(unsigned int irq, struct irqdesc *desc,				struct pt_regs *regs){	unsigned long pending = LUB_IRQ_SET_CLR & lubbock_irq_enabled;	do {		GEDR(0) = GPIO_bit(0);	/* clear our parent irq */		if (likely(pending)) {			irq = LUBBOCK_IRQ(0) + __ffs(pending);			desc = irq_desc + irq;			desc->handle(irq, desc, regs);		}		pending = LUB_IRQ_SET_CLR & lubbock_irq_enabled;	} while (pending);}#endifstatic void __init lubbock_init_irq(void){	int irq;	pxa_init_irq();#ifndef	CONFIG_ARCH_FS_PXA255	/* setup extra lubbock irqs */	for (irq = LUBBOCK_IRQ(0); irq <= LUBBOCK_LAST_IRQ; irq++) {		set_irq_chip(irq, &lubbock_irq_chip);		set_irq_handler(irq, do_level_IRQ);		set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);	}	set_irq_chained_handler(IRQ_GPIO(0), lubbock_irq_handler);	set_irq_type(IRQ_GPIO(0), IRQT_FALLING);#else	//set_irq_handler(IRQ_GPIO(3), do_level_IRQ);	//smc91c111 irq	//set_irq_type(IRQ_GPIO(3), IRQT_RISING);	//smc91c111 irq	//set_irq_type(IRQ_GPIO(22), IRQT_RISING);	//sl811hs irq, initialized in driver	set_irq_type(IRQ_GPIO(9), IRQT_RISING);		//pen down#endif}static int lubbock_udc_is_connected(void){#ifdef	CONFIG_ARCH_FS_PXA255  #ifdef	CONFIG_ARCH_FS_PXA255	return (GPLR0 & (1<<27));	//GP27  #else	return (GPLR2 & (1<<20));	//GP84  #endif#else	return (LUB_MISC_RD & (1 << 9)) == 0;	//return 1;#endif}static void lubbock_udc_command(int cmd){#ifdef	CONFIG_ARCH_FS_PXA255	if(cmd==PXA2XX_UDC_CMD_CONNECT) {		pxa_gpio_mode(21|GPIO_OUT);		//udc connect		GPSR0 = 1<<21;	} else		pxa_gpio_mode(21|GPIO_IN);		//udc disconnect		//GPCR0 = 1<<21;#endif}static struct pxa2xx_udc_mach_info udc_info __initdata = {	.udc_is_connected	= lubbock_udc_is_connected,	// no D+ pullup; lubbock can't connect/disconnect in software	.udc_command		= lubbock_udc_command,};#ifndef	CONFIG_ARCH_FS_PXA255static struct resource sa1111_resources[] = {	[0] = {		.start	= 0x10000000,		.end	= 0x10001fff,		.flags	= IORESOURCE_MEM,	},	[1] = {		.start	= LUBBOCK_SA1111_IRQ,		.end	= LUBBOCK_SA1111_IRQ,		.flags	= IORESOURCE_IRQ,	},};static struct platform_device sa1111_device = {	.name		= "sa1111",	.id		= -1,	.num_resources	= ARRAY_SIZE(sa1111_resources),	.resource	= sa1111_resources,};#endifstatic struct resource smc91x_resources[] = {#ifdef	CONFIG_ARCH_FS_PXA255	[0] = {		.start	= 0x08000300,		.end	= 0x080fffff,		.flags	= IORESOURCE_MEM,	},	[1] = {		.start	= IRQ_GPIO(3),		.end	= IRQ_GPIO(3),		.flags	= IORESOURCE_IRQ,	},	[2] = {		.start	= 0x0a000000,		.end	= 0x0a0fffff,		.flags	= IORESOURCE_MEM,	},#else	[0] = {		.start	= 0x0c000000,		.end	= 0x0c0fffff,		.flags	= IORESOURCE_MEM,	},	[1] = {		.start	= LUBBOCK_ETH_IRQ,		.end	= LUBBOCK_ETH_IRQ,		.flags	= IORESOURCE_IRQ,	},	[2] = {		.start	= 0x0e000000,		.end	= 0x0e0fffff,		.flags	= IORESOURCE_MEM,	},#endif};static struct platform_device smc91x_device = {	.name		= "smc91x",	.id		= -1,	.num_resources	= ARRAY_SIZE(smc91x_resources),	.resource	= smc91x_resources,};#ifdef CONFIG_ARCH_FS_PXA255static struct resource dm9000_resources[] = {  #ifdef CONFIG_ARCH_FS_PXA255_V30	[0] = {		.start	= 0x04000330,		.end	= 0x04000fff,		.flags	= IORESOURCE_MEM,	},	[1] = {		.start	= IRQ_GPIO(3),		.end	= IRQ_GPIO(3),		.flags	= IORESOURCE_IRQ,	},  #else	[0] = {		.start	= 0x0c000300,		.end	= 0x0c000fff,		.flags	= IORESOURCE_MEM,	},	[1] = {		.start	= IRQ_GPIO(7),		.end	= IRQ_GPIO(7),		.flags	= IORESOURCE_IRQ,	},  #endif};static struct platform_device dm9000_device = {	.name		= "dmfe",	.id		= -1,	.num_resources	= ARRAY_SIZE(dm9000_resources),	.resource	= dm9000_resources,};static struct resource dm9000_resources1[] = {	[0] = {		.start	= 0x0c001310,		.end	= 0x0c001fff,		.flags	= IORESOURCE_MEM,	},	[1] = {		.start	= IRQ_GPIO(14),		.end	= IRQ_GPIO(14),		.flags	= IORESOURCE_IRQ,	},};static struct platform_device dm9000_device1 = {	.name		= "dmfe1",	.id		= -1,	.num_resources	= ARRAY_SIZE(dm9000_resources1),	.resource	= dm9000_resources1,};static u64 uhc_dma_mask = ~(u64)0;static struct resource sl811_resources[] = {	[0] = {		.start	= 0x04700000,		.end	= 0x047fffff,		.flags	= IORESOURCE_MEM,	},	[1] = {		.start	= IRQ_GPIO(22),		.end	= IRQ_GPIO(22),		.flags	= IORESOURCE_IRQ,	},};static struct platform_device sl811_device = {	.name		  = "sl811-ohci",	.id		  = 0,	.dev		  = {		.dma_mask	   = &uhc_dma_mask,		.coherent_dma_mask = 0xffffffff,	},	.num_resources	  = 2,	.resource	  = sl811_resources,};#endifstatic struct platform_device *devices[] __initdata = {#ifndef	CONFIG_ARCH_FS_PXA255	&sa1111_device,#endif	&smc91x_device,#ifdef	CONFIG_ARCH_FS_PXA255	&sl811_device,	&dm9000_device,	&dm9000_device1,#endif};static void backlight_power(int on);static struct pxafb_mach_info sharp_lm8v31 __initdata = {#ifdef CONFIG_FB_PXA_PRIME_VIEW_640X480	.pixclock	= 1600,	//unit = 10KHz	.xres		= 640,	.yres		= 480,	.bpp		= 16,	.hsync_len	= 10,	.left_margin	= 132,	.right_margin	= 10,	.vsync_len	= 6,	.upper_margin	= 10,	.lower_margin	= 10,	.sync		= FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,	.cmap_greyscale	= 0,	.cmap_inverse	= 0,	.cmap_static	= 0,	.lccr0		= LCCR0_Act,	.lccr3		= LCCR3_VSP | LCCR3_HSP | LCCR3_Acb(255),	.pxafb_backlight_power	= backlight_power,#elif defined CONFIG_FB_PXA_SHARP_640X480	.pixclock	= 1600,	//unit = 10KHz	.xres		= 640,	.yres		= 480,	.bpp		= 16,	.hsync_len	= 8,	.left_margin	= 24,	.right_margin	= 8,	.vsync_len	= 2,	.upper_margin	= 34,	.lower_margin	= 4,	.sync		= FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,	.cmap_greyscale	= 0,	.cmap_inverse	= 0,	.cmap_static	= 0,	.lccr0		= LCCR0_Act,	.lccr3		= LCCR3_Acb(255),	.pxafb_backlight_power	= backlight_power,#elif defined CONFIG_FB_PXA_SHARP_240X320	.pixclock	= 500,	//unit = 10KHz	.xres		= 240,	.yres		= 320,	.bpp		= 16,	.hsync_len	= 2,	.left_margin	= 10,	.right_margin	= 10,	.vsync_len	= 2,	.upper_margin	= 5,	.lower_margin	= 5,	.sync		= FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,	.cmap_greyscale	= 0,	.cmap_inverse	= 0,	.cmap_static	= 0,	.lccr0		= LCCR0_Act,	.lccr3		= LCCR3_PCP | LCCR3_Acb(255),	.pxafb_backlight_power	= backlight_power,#else	.pixclock	= 270000,	.xres		= 640,	.yres		= 480,	.bpp		= 16,	.hsync_len	= 1,	.left_margin	= 3,	.right_margin	= 3,	.vsync_len	= 1,	.upper_margin	= 0,	.lower_margin	= 0,	.sync		= FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,	.cmap_greyscale	= 0,	.cmap_inverse	= 0,	.cmap_static	= 0,	.lccr0		= LCCR0_SDS,	.lccr3		= LCCR3_PCP | LCCR3_Acb(255),#endif};static __u8  backlight_on = 0;static __u8  backlight_duty = 80;//static __u16 backlight_period = 99;#define	backlight_period	100#define	BKLT_LED_CTRL#if defined CONFIG_LEDS && defined BKLT_LED_CTRL#include <asm/leds.h>#define	LED_BKLT_ON	leds_event(led_red_on)#define	LED_BKLT_OFF	leds_event(led_red_off)#else#define	LED_BKLT_ON#define	LED_BKLT_OFF#endifstatic void backlight_power(int on){	//printk("set backlight %s, period=%d, duty=%d\n", on?"on":"off", backlight_period, backlight_duty);	backlight_on = on;	if(on) {		//printk(KERN_ERR "Backlight on\n");		CKEN |= CKEN1_PWM1;		pxa_gpio_mode(GPIO17_PWM1_MD);		PWM_PWDUTY1 = (backlight_duty*backlight_period)/100;		PWM_PERVAL1 = backlight_period-1;		PWM_CTRL1 = (0<<6)|59;		LED_BKLT_ON;	} else {		//printk(KERN_ERR "Backlight off\n");		//backlight_duty = PWM_PWDUTY1;		//backlight_period = PWM_PERVAL1;		PWM_PWDUTY1 = 0;		PWM_PERVAL1 = 0;		CKEN &= ~CKEN1_PWM1;		LED_BKLT_OFF;	}}#ifdef	CONFIG_PROC_FS#include <linux/proc_fs.h>#include <asm/uaccess.h>static int backlight_proc_read (	char			*page,	char			**start,	off_t			off,	int 			count,	int 			*eof,	void			*data){	int  len = 0;	len += sprintf(page+len, "Backlight duty = %d%%\n", backlight_duty);	*start = page+off;	len -= off;	if(len<=count)		*eof = 1;	else		len = count;	if(len<0)		len = 0;	return len;}static int backlight_proc_write (        struct file		*file,        const char		__user *buffer,        unsigned long		count,        void			*data){	char tmp[10];	int i;	if(count>10)		count = 10;	if (copy_from_user(tmp, buffer, count))		return -EFAULT;	if(tmp[0]<'1'||tmp[0]>'9')		return -EINVAL;	i = tmp[0]-'0';		if(tmp[1]<'0'||tmp[1]>'9')		goto set_end;	i *= 10;	i += tmp[1]-'0';		if(tmp[2]<'0'||tmp[2]>'9')		goto set_end;	i *= 10;	i += tmp[2]-'0';set_end:	if(i>100)		i = 100;	if(backlight_duty!=i) {		backlight_duty = i;		if(backlight_on) {			unsigned long flags;			local_irq_save(flags);			backlight_power(1);			local_irq_restore(flags);		}		//printk("set backlight %d%%\n", i);	}	return count;}#endifstatic void bklt_proc_init(void){	struct proc_dir_entry *entry = NULL;	/* are these acceptable values? */	entry = create_proc_entry("backlight", S_IFREG|S_IRUGO|S_IWUSR, 			  &proc_root);	if (!entry)		printk(KERN_ERR "unable to create /proc/backlight entry\n");			else {		entry->read_proc = backlight_proc_read;		entry->write_proc = backlight_proc_write;	}}static void __init lubbock_init(void){	pxa_set_udc_info(&udc_info);	set_pxa_fb_info(&sharp_lm8v31);	(void) platform_add_devices(devices, ARRAY_SIZE(devices));#ifdef	CONFIG_ARCH_FS_PXA255	pxa_gpio_mode(0|GPIO_IN);		//key 0	pxa_gpio_mode(1|GPIO_IN);		//key 1	pxa_gpio_mode(4|GPIO_OUT);		//time led	pxa_gpio_mode(5|GPIO_OUT);		//busy led	//pxa_gpio_mode(GPIO10_RTCCLK_MD);	//one 32khz plus pulse occured per second	pxa_gpio_mode(21|GPIO_IN);		//udc connect  #ifdef CONFIG_ARCH_FS_PXA255_V30	pxa_gpio_mode(26|GPIO_IN);		//key 2	pxa_gpio_mode(27|GPIO_IN);		//key 3 & udc connect detect	pxa_gpio_mode(81|GPIO_OUT);		//amber led & fir enable/disable	pxa_gpio_mode(82|GPIO_OUT);		//green led	pxa_gpio_mode(83|GPIO_OUT);		//red led & backlight enable/disable	pxa_gpio_mode(84|GPIO_OUT);		//blue led  #else	pxa_gpio_mode(10|GPIO_OUT);		//blue led	pxa_gpio_mode(11|GPIO_OUT);		//green led	pxa_gpio_mode(12|GPIO_OUT);		//amber led & fir enable/disable	pxa_gpio_mode(26|GPIO_OUT);		//red led & backlight enable/disable	pxa_gpio_mode(84|GPIO_IN);		//udc connect detect	pxa_gpio_mode(22|GPIO_IN);		//sl811hs irq  #endif#endif	bklt_proc_init();}#ifndef	CONFIG_ARCH_FS_PXA255static struct map_desc lubbock_io_desc[] __initdata = {  { LUBBOCK_FPGA_VIRT, LUBBOCK_FPGA_PHYS, 0x00100000, MT_DEVICE }, /* CPLD */};#endifstatic void __init lubbock_map_io(void){	pxa_map_io();#ifndef	CONFIG_ARCH_FS_PXA255	iotable_init(lubbock_io_desc, ARRAY_SIZE(lubbock_io_desc));#endif	/* This enables the BTUART */	pxa_gpio_mode(GPIO42_BTRXD_MD);	pxa_gpio_mode(GPIO43_BTTXD_MD);	pxa_gpio_mode(GPIO44_BTCTS_MD);	pxa_gpio_mode(GPIO45_BTRTS_MD);	/* This is for the SMC chip select */	pxa_gpio_mode(GPIO79_nCS_3_MD);	/* setup sleep mode values */	PWER  = 0x00000002;	//check GP1 falling edge	PFER  = 0x00000002;	PRER  = 0x00000000;#ifdef CONFIG_ARCH_FS_PXA255	PGSR0 = 0x0C009CB0;	PGSR1 = 0x003F0202;	PGSR2 = 0x0001C000;#else	PGSR0 = 0x00008000;	PGSR1 = 0x003F0202;	PGSR2 = 0x0001C000;#endif//	PCFR |= PCFR_OPDE;	PCFR = PCFR_OPDE;}MACHINE_START(LUBBOCK, "Intel DBPXA250 Development Platform (aka Lubbock)")	MAINTAINER("MontaVista Software Inc.")	BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000))	BOOT_PARAMS(0xa0000100)	MAPIO(lubbock_map_io)	INITIRQ(lubbock_init_irq)	INITTIME(pxa_init_time)	INIT_MACHINE(lubbock_init)MACHINE_END

⌨️ 快捷键说明

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