📄 mach-utu2440.c
字号:
/* linux/arch/arm/mach-s3c2440/mach-utu2440.c*/#include <linux/kernel.h>#include <linux/types.h>#include <linux/interrupt.h>#include <linux/list.h>#include <linux/timer.h>#include <linux/init.h>#include <linux/sysdev.h>#include <linux/serial_core.h>#include <linux/platform_device.h>#include <asm/mach/arch.h>#include <asm/mach/map.h>#include <asm/mach/irq.h>#include <asm/hardware.h>#include <asm/io.h>#include <asm/irq.h>#include <asm/mach-types.h>#include <asm/plat-s3c/regs-serial.h>#include <asm/arch/regs-gpio.h>#include <asm/arch/regs-lcd.h>#include <asm/arch/udc.h>#include <asm/arch/idle.h>#include <asm/arch/fb.h>#include <asm/arch/ts.h>#include <asm/arch/lcd.h>#include <asm/arch/map.h> #include <asm/plat-s3c24xx/s3c2410.h>#include <asm/plat-s3c24xx/s3c2440.h>#include <asm/plat-s3c24xx/clock.h>#include <asm/plat-s3c24xx/devs.h>#include <asm/plat-s3c24xx/cpu.h>#include <asm/plat-s3c/nand.h>#include <linux/mtd/mtd.h>#include <linux/mtd/nand.h>#include <linux/mtd/nand_ecc.h>#include <linux/mtd/partitions.h>static struct map_desc utu2440_iodesc[] __initdata = { [0] = { .virtual = (unsigned long)S3C24XX_VA_DM9000, .pfn = __phys_to_pfn(S3C24XX_PA_DM9000), .length = SZ_1M, .type = MT_DEVICE, }, [1] = { .virtual = (unsigned long)S3C24XX_VA_IIS, .pfn = __phys_to_pfn(S3C2410_PA_IIS), .length = S3C24XX_SZ_IIS, .type = MT_DEVICE },};#define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODEstatic struct s3c2410_uartcfg utu2440_uartcfgs[] __initdata = { [0] = { .hwport = 0, .flags = 0, .ucon = 0x3c5, .ulcon = 0x03, .ufcon = 0x51, }, [1] = { .hwport = 1, .flags = 0, .ucon = 0x3c5, .ulcon = 0x03, .ufcon = 0x51, }, [2] = { .hwport = 2, .flags = 0, .ucon = 0x3c5, .ulcon = 0x03, .ufcon = 0x51, }#ifdef IR_PORT /* IR port */ [2] = { .hwport = 2, .flags = 0, .uart_flags = 0, .ucon = 0x3c5, .ulcon = 0x43, .ufcon = 0x51, }#endif}; static void utu2440_udc_pullup(enum s3c2410_udc_cmd_e cmd){ printk(KERN_DEBUG "udc: pullup(%d)\n",cmd); switch (cmd) { case S3C2410_UDC_P_ENABLE : //not realsized break; case S3C2410_UDC_P_DISABLE : //not realsized break; case S3C2410_UDC_P_RESET : break; default: break; }}static struct s3c2410_udc_mach_info utu2440_udc_cfg __initdata = { .udc_command = utu2440_udc_pullup, .vbus_pin = S3C2410_GPG5, .vbus_pin_inverted = 1,};/* For Sumsang 4.3 Touch screen */static struct s3c2410_ts_mach_info utu2440_ts_cfg __initdata = { .delay = 10000, .presc = 49, .oversampling_shift = 2,};#if defined(CONFIG_FB_S3C2410_240X320_NEC)static struct s3c2410fb_display utu2440_lcdcfg __initdata = { .lcdcon5= S3C2410_LCDCON5_FRM565 | \ S3C2410_LCDCON5_INVVLINE | \ S3C2410_LCDCON5_INVVFRAME | \ S3C2410_LCDCON5_PWREN | \ S3C2410_LCDCON5_HWSWP, .type = S3C2410_LCDCON1_TFT, .width = 240, .height = 320, .pixclock = 120000, .xres = 240, .yres = 320, .bpp = 16, .left_margin = 20,//reg3 .right_margin = 37,//reg3 .hsync_len = 6, /* value in pixels (TFT) or HCLKs (STN) */ .upper_margin = 2,//reg2 .lower_margin = 6,//reg2 .vsync_len = 2, /* value in lines (TFT) or 0 (STN) */};static struct s3c2410fb_mach_info utu2440_fb_info __initdata = { .displays = &utu2440_lcdcfg, .num_displays = 1, .default_display = 0, .lpcsel= 0xf82, .gpccon= 0xaa955699, .gpccon_mask= 0xffc003cc, .gpcup= 0x0000ffff, .gpcup_mask= 0xffffffff, .gpdcon = 0xaa95aaa1, .gpdcon_mask = 0xffc0fff0, .gpdup = 0x0000faff, .gpdup_mask = 0xffffffff,};#endif#if defined(CONFIG_FB_S3C2410_320X240_SAMSUNG)static struct s3c2410fb_display utu2440_lcdcfg __initdata = { .lcdcon5= S3C2410_LCDCON5_FRM565 | \ S3C2410_LCDCON5_INVVLINE | \ S3C2410_LCDCON5_INVVFRAME | \ S3C2410_LCDCON5_PWREN | \ S3C2410_LCDCON5_HWSWP, .type = S3C2410_LCDCON1_TFT, .width = 320, .height = 240, .pixclock = 160000, .xres = 320, .yres = 240, .bpp = 16, .left_margin = 16, .right_margin = 6, .hsync_len = 9, .upper_margin = 4, .lower_margin = 6, .vsync_len = 16,};static struct s3c2410fb_mach_info utu2440_fb_info __initdata = { .displays = &utu2440_lcdcfg, .num_displays = 1, .default_display = 0, .lpcsel= 0xf82, .gpccon= 0xaa955699, .gpccon_mask= 0xffc003cc, .gpcup= 0x0000ffff, .gpcup_mask= 0xffffffff, .gpdcon = 0xaa95aaa1, .gpdcon_mask = 0xffc0fff0, .gpdup = 0x0000faff, .gpdup_mask = 0xffffffff,};#endif#if defined(CONFIG_FB_S3C2410_480X290)static struct s3c2410fb_display utu2440_lcdcfg __initdata = { .lcdcon5= S3C2410_LCDCON5_FRM565 | \ S3C2410_LCDCON5_INVVLINE | \ S3C2410_LCDCON5_INVVFRAME | \ S3C2410_LCDCON5_PWREN | \ S3C2410_LCDCON5_HWSWP, .type = S3C2410_LCDCON1_TFT, .width = 480, .height = 290, .pixclock = 40000, .xres = 480, .yres = 290, .bpp = 16, .left_margin = 16, .right_margin = 48, .hsync_len = 96, .upper_margin = 33, .lower_margin = 10, .vsync_len = 2,};static struct s3c2410fb_mach_info utu2440_fb_info __initdata = { .displays = &utu2440_lcdcfg, .num_displays = 1, .default_display = 0, .lpcsel= 0xf82, .gpccon= 0xaa955699, .gpccon_mask= 0xffc003cc, .gpcup= 0x0000ffff, .gpcup_mask= 0xffffffff, .gpdcon = 0xaa95aaa1, .gpdcon_mask = 0xffc0fff0, .gpdup = 0x0000faff, .gpdup_mask = 0xffffffff,};#endif#if defined(CONFIG_FB_S3C2410_480X272)/* For Sumsang 4.3 LCD */static struct s3c2410fb_display utu2440_lcdcfg __initdata = { .lcdcon5= S3C2410_LCDCON5_FRM565 | \ S3C2410_LCDCON5_INVVLINE | \ S3C2410_LCDCON5_INVVFRAME | \ S3C2410_LCDCON5_PWREN | \ S3C2410_LCDCON5_HWSWP, .type = S3C2410_LCDCON1_TFT, .width = 480, .height = 272, .pixclock = 40000, //S3C2410_LCDCON1_CLKVAL+1 * 20000 .xres = 480, .yres = 272, .bpp = 16, .left_margin = 16, .right_margin = 6, .hsync_len = 96, .upper_margin = 2, .lower_margin = 6, .vsync_len = 10,};static struct s3c2410fb_mach_info utu2440_fb_info __initdata = { .displays = &utu2440_lcdcfg, .num_displays = 1, .default_display = 0, .lpcsel= 0xf82, .gpccon= 0xaa955699, .gpccon_mask= 0xffc003cc, .gpcup= 0x0000ffff, .gpcup_mask= 0xffffffff, .gpdcon = 0xaa95aaa1, .gpdcon_mask = 0xffc0fff0, .gpdup = 0x0000faff, .gpdup_mask = 0xffffffff,};#endif#if defined(CONFIG_FB_S3C2410_800X480)static struct s3c2410fb_display utu2440_lcdcfg __initdata = { .lcdcon5= S3C2410_LCDCON5_FRM565 | \ S3C2410_LCDCON5_INVVLINE | \ S3C2410_LCDCON5_INVVFRAME | \ S3C2410_LCDCON5_PWREN | \ S3C2410_LCDCON5_HWSWP, .type = S3C2410_LCDCON1_TFT, .width = 800, .height = 480, .pixclock = 40000, .xres = 800, .yres = 480, .bpp = 16, .left_margin = 16, .right_margin = 48, .hsync_len = 96, .upper_margin = 6, .lower_margin = 10, .vsync_len = 2,};static struct s3c2410fb_mach_info utu2440_fb_info __initdata = { .displays = &utu2440_lcdcfg, .num_displays = 1, .default_display = 0, .lpcsel= 0xf82, .gpccon= 0xaa955699, .gpccon_mask= 0xffc003cc, .gpcup= 0x0000ffff, .gpcup_mask= 0xffffffff, .gpdcon = 0xaa95aaa1, .gpdcon_mask = 0xffc0fff0, .gpdup = 0x0000faff, .gpdup_mask = 0xffffffff,};#endif#if defined(CONFIG_FB_S3C2410_640X480)static struct s3c2410fb_display utu2440_lcdcfg __initdata = { .lcdcon5= S3C2410_LCDCON5_FRM565 | \ S3C2410_LCDCON5_INVVLINE | \ S3C2410_LCDCON5_INVVFRAME | \ S3C2410_LCDCON5_PWREN | \ S3C2410_LCDCON5_HWSWP, .type = S3C2410_LCDCON1_TFT, .width = 640, .height = 480, .pixclock = 40000, .xres = 640, .yres = 480, .bpp = 16, .left_margin = 16, .right_margin = 48, .hsync_len = 96, .upper_margin = 33, .lower_margin = 10, .vsync_len = 2,};static struct s3c2410fb_mach_info utu2440_fb_info __initdata = { .displays = &utu2440_lcdcfg, .num_displays = 1, .default_display = 0, .lpcsel= 0xf82, .gpccon= 0xaa955699, .gpccon_mask= 0xffc003cc, .gpcup= 0x0000ffff, .gpcup_mask= 0xffffffff, .gpdcon = 0xaa95aaa1, .gpdcon_mask = 0xffc0fff0, .gpdup = 0x0000faff, .gpdup_mask = 0xffffffff,};#endif/* 以下为2008-12 为 sanso ebook 增加 */ #if defined(CONFIG_FB_S3C2410_SHARP_480X320)static struct s3c2410fb_display utu2440_lcdcfg __initdata = { .lcdcon5= S3C2410_LCDCON5_BSWP | S3C2410_LCDCON5_INVVD | S3C2410_LCDCON5_PWREN, .type = S3C2410_LCDCON1_STN8, .width = 480, .height = 320, .pixclock = 625000, .xres = 480, .yres = 320, .bpp = 4, .left_margin = 48, .right_margin = 80, .hsync_len = 96, /* WLH STN VLINE width 1 is 32 vlck */ .upper_margin = 0, .lower_margin = 0, .vsync_len = 0, /* VSPW STN is 0 */};static struct s3c2410fb_mach_info utu2440_fb_info __initdata = { .displays = &utu2440_lcdcfg, .num_displays = 1, .default_display = 0, .lpcsel= 0xf82, .gpccon= 0xaa955699, .gpccon_mask= 0xffc003cc, .gpcup= 0x0000ffff, .gpcup_mask= 0xffffffff, .gpdcon = 0xaa95aaa1, .gpdcon_mask = 0xffc0fff0, .gpdup = 0x0000faff, .gpdup_mask = 0xffffffff,};#endif/* ---------------------------------------------------* This is used for add your own devices here----------------------------------------------------*//* Nand Flash board */static int chip0_map[] = { 0 };struct mtd_partition bit_default_nand_part[] = {[0] = {.name = "bootloader", .offset = 0x00000000, .size = 0x00060000, },[1] = { .name = "kernel", .offset = 0x00060000, .size = 0x00200000, },[2] = { .name = "root", .offset = 0x00260000, .size = 0x3d9c000,},};/* the bit has 1 selectable slots for nand-flash, the three * on-board chip areas, as well as the external SmartMedia * slot. * * Note, there is no current hot-plug support for the SmartMedia * socket.*/static struct s3c2410_nand_set bit_nand_sets[] = { [0] = { .name = "chip0", .nr_chips = 1, .nr_map = chip0_map, .nr_partitions = ARRAY_SIZE(bit_default_nand_part), .partitions = bit_default_nand_part },};static struct s3c2410_platform_nand bit_nand_info = { .tacls = 0, .twrph0 = 30, .twrph1 = 0, .nr_sets = ARRAY_SIZE(bit_nand_sets), .sets = bit_nand_sets,};/* Register Platform Devices structure */static struct platform_device *utu2440_devices[] __initdata = { &s3c_device_usb, &s3c_device_lcd, &s3c_device_wdt, &s3c_device_i2c, &s3c_device_iis, &s3c_device_usbgadget, &s3c_device_ts, &s3c_device_dm9000, &s3c_device_nand, &s3c_device_sound, &s3c_device_buttons, &s3c_device_rtc, &s3c_device_sdi, };static struct s3c24xx_board utu2440_board __initdata={ .devices = utu2440_devices, .devices_count = ARRAY_SIZE(utu2440_devices)};static void __init utu2440_map_io(void){ //function defined in cpu.c s3c24xx_init_io(utu2440_iodesc, ARRAY_SIZE(utu2440_iodesc)); s3c24xx_init_clocks(12000000); //CPU clock 12Mhz s3c24xx_init_uarts(utu2440_uartcfgs, ARRAY_SIZE(utu2440_uartcfgs)); s3c24xx_set_board(&utu2440_board);}static void __init utu2440_init_irq(void){ s3c24xx_init_irq();}static void __init utu2440_init(void){ s3c24xx_fb_set_platdata(&utu2440_fb_info); s3c24xx_udc_set_platdata(&utu2440_udc_cfg); s3c24xx_ts_set_platdata(&utu2440_ts_cfg); /* Turn off suspend on both USB ports, and switch the * selectable USB port to USB device mode. */ s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST | S3C2410_MISCCR_USBSUSPND0 | S3C2410_MISCCR_USBSUSPND1, 0x0); /* This is different from lagency kernel packs */ platform_add_devices(utu2440_devices, ARRAY_SIZE(utu2440_devices)); //register devices list in the devices.c file s3c2410_gpio_cfgpin(S3C2410_GPF4, S3C2410_GPF4_OUTP); s3c2410_gpio_cfgpin(S3C2410_GPF5, S3C2410_GPF5_OUTP); s3c2410_gpio_cfgpin(S3C2410_GPF6, S3C2410_GPF6_OUTP); s3c2410_gpio_cfgpin(S3C2410_GPF7, S3C2410_GPF7_OUTP); s3c2410_gpio_setpin(S3C2410_GPF4, 0); s3c2410_gpio_setpin(S3C2410_GPF5, 0); s3c2410_gpio_setpin(S3C2410_GPF6, 0); s3c2410_gpio_setpin(S3C2410_GPF7, 0); s3c2410_gpio_cfgpin(S3C2410_GPB4, S3C2410_GPB4_OUTP); s3c2410_gpio_setpin(S3C2410_GPB4, 1); s3c_device_nand.dev.platform_data = &bit_nand_info;}//machine_desc structMACHINE_START(UTU2440, "UTU2440") //the first is defined as MACH_TYPE_UTU2440 and the second //parameter is defined as the machine name as in mach-types .phys_io = S3C2410_PA_UART, .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc, .boot_params = S3C2410_SDRAM_PA + 0x100, .map_io = utu2440_map_io, //used in cpu.c .init_irq = utu2440_init_irq, //used in cpu.c .init_machine = utu2440_init, //used in cpu.c .timer = &s3c24xx_timer,MACHINE_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -