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

📄 mach-utu2440.c

📁 2440驱动stn黑白屏linux 驱动
💻 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 + -