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 + -
显示快捷键?