From 467299d85c49991e194cc1c995bb7bd43d7cfb08 Mon Sep 17 00:00:00 2001 From: Angell Fear Date: Wed, 22 Sep 2010 21:11:15 +0600 Subject: [PATCH] fix fb soft rending, ts --- kernel-2.6.33/arch/arm/configs/g900_defconfig | 204 +++++++++-------- kernel-2.6.33/arch/arm/mach-pxa/g900/Kconfig | 6 + kernel-2.6.33/arch/arm/mach-pxa/g900/Makefile | 3 +- kernel-2.6.33/arch/arm/mach-pxa/g900/g900.c | 44 +++- .../arch/arm/mach-pxa/g900/g900_leds.c | 4 +- .../drivers/input/touchscreen/ak4183.c | 211 ++++++++---------- kernel-2.6.33/drivers/video/g900fb2.c | 148 ++++++------ ramfs-android/bin/MAKEDEVS | 36 +++ ramfs-android/init | 12 +- ramfs-android/init.rc | 4 +- ramfs-android/init_1 | Bin 102244 -> 106576 bytes 11 files changed, 378 insertions(+), 294 deletions(-) create mode 100755 ramfs-android/bin/MAKEDEVS diff --git a/kernel-2.6.33/arch/arm/configs/g900_defconfig b/kernel-2.6.33/arch/arm/configs/g900_defconfig index cf99168d..9b572309 100644 --- a/kernel-2.6.33/arch/arm/configs/g900_defconfig +++ b/kernel-2.6.33/arch/arm/configs/g900_defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux kernel version: 2.6.33 -# Mon Aug 23 14:03:45 2010 +# Sat Sep 11 04:31:01 2010 # CONFIG_ARM=y CONFIG_HAVE_PWM=y @@ -64,7 +64,7 @@ CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=17 CONFIG_GROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y -# CONFIG_RT_GROUP_SCHED is not set +CONFIG_RT_GROUP_SCHED=y CONFIG_USER_SCHED=y # CONFIG_CGROUP_SCHED is not set CONFIG_CGROUPS=y @@ -85,17 +85,17 @@ CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y CONFIG_BLK_DEV_INITRD=y -CONFIG_INITRAMFS_SOURCE="../ramfs-android" +CONFIG_INITRAMFS_SOURCE="../ramfs-android/" CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 CONFIG_RD_GZIP=y # CONFIG_RD_BZIP2 is not set -CONFIG_RD_LZMA=y +# CONFIG_RD_LZMA is not set # CONFIG_RD_LZO is not set # CONFIG_INITRAMFS_COMPRESSION_NONE is not set -# CONFIG_INITRAMFS_COMPRESSION_GZIP is not set +CONFIG_INITRAMFS_COMPRESSION_GZIP=y # CONFIG_INITRAMFS_COMPRESSION_BZIP2 is not set -CONFIG_INITRAMFS_COMPRESSION_LZMA=y +# CONFIG_INITRAMFS_COMPRESSION_LZMA is not set # CONFIG_INITRAMFS_COMPRESSION_LZO is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y @@ -104,7 +104,6 @@ CONFIG_EMBEDDED=y CONFIG_UID16=y CONFIG_SYSCTL_SYSCALL=y CONFIG_KALLSYMS=y -CONFIG_KALLSYMS_ALL=y # CONFIG_KALLSYMS_EXTRA_PASS is not set CONFIG_HOTPLUG=y CONFIG_PRINTK=y @@ -138,7 +137,6 @@ CONFIG_HAVE_CLK=y # # GCOV-based kernel profiling # -# CONFIG_GCOV_KERNEL is not set # CONFIG_SLOW_WORK is not set CONFIG_HAVE_GENERIC_DMA_COHERENT=y CONFIG_SLABINFO=y @@ -305,6 +303,8 @@ CONFIG_G900_KBR=y CONFIG_G900_BUTTON=y CONFIG_G900_LEDS=y CONFIG_G900_PHONE=y +CONFIG_G900_POWER_BUTTON=y +CONFIG_G900_FLASH=y CONFIG_PXA27x=y CONFIG_PXA_SSP=y CONFIG_PLAT_PXA=y @@ -389,7 +389,7 @@ CONFIG_KEXEC=y # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_TABLE=y -CONFIG_CPU_FREQ_DEBUG=y +# CONFIG_CPU_FREQ_DEBUG is not set CONFIG_CPU_FREQ_STAT=y CONFIG_CPU_FREQ_STAT_DETAILS=y CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y @@ -427,8 +427,7 @@ CONFIG_HAVE_AOUT=y # Power management options # CONFIG_PM=y -CONFIG_PM_DEBUG=y -CONFIG_PM_VERBOSE=y +# CONFIG_PM_DEBUG is not set # CONFIG_SUSPEND is not set CONFIG_HAS_WAKELOCK=y CONFIG_HAS_EARLYSUSPEND=y @@ -539,14 +538,13 @@ CONFIG_WEXT_SPY=y CONFIG_CFG80211=y CONFIG_NL80211_TESTMODE=y CONFIG_CFG80211_DEVELOPER_WARNINGS=y -CONFIG_CFG80211_REG_DEBUG=y +# CONFIG_CFG80211_REG_DEBUG is not set CONFIG_CFG80211_DEFAULT_PS=y -CONFIG_CFG80211_DEBUGFS=y CONFIG_WIRELESS_OLD_REGULATORY=y CONFIG_CFG80211_WEXT=y CONFIG_WIRELESS_EXT_SYSFS=y CONFIG_LIB80211=y -CONFIG_LIB80211_DEBUG=y +# CONFIG_LIB80211_DEBUG is not set CONFIG_MAC80211=y # CONFIG_MAC80211_RC_PID is not set # CONFIG_MAC80211_RC_MINSTREL is not set @@ -555,7 +553,6 @@ CONFIG_MAC80211=y CONFIG_MAC80211_RC_DEFAULT="" CONFIG_MAC80211_MESH=y # CONFIG_MAC80211_LEDS is not set -# CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_DEBUG_MENU is not set # CONFIG_WIMAX is not set CONFIG_RFKILL=y @@ -578,11 +575,96 @@ CONFIG_FW_LOADER=y # CONFIG_FIRMWARE_IN_KERNEL is not set CONFIG_EXTRA_FIRMWARE="libertas/gspi8385_hlp.bin libertas/gspi8385.bin" CONFIG_EXTRA_FIRMWARE_DIR="../FW" -CONFIG_DEBUG_DRIVER=y -CONFIG_DEBUG_DEVRES=y # CONFIG_SYS_HYPERVISOR is not set # CONFIG_CONNECTOR is not set -# CONFIG_MTD is not set +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +# CONFIG_MTD_TESTS is not set +# CONFIG_MTD_CONCAT is not set +# CONFIG_MTD_PARTITIONS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +# CONFIG_MTD_BLKDEVS is not set +# CONFIG_MTD_BLOCK is not set +# CONFIG_MTD_BLOCK_RO is not set +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set +# CONFIG_MTD_OOPS is not set + +# +# RAM/ROM/Flash chip drivers +# +# CONFIG_MTD_CFI is not set +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +# CONFIG_MTD_RAM is not set +CONFIG_MTD_ROM=y +# CONFIG_MTD_ABSENT is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +CONFIG_MTD_PHYSMAP=y +# CONFIG_MTD_PHYSMAP_COMPAT is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_DATAFLASH is not set +# CONFIG_MTD_M25P80 is not set +# CONFIG_MTD_SST25L is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +CONFIG_MTD_NAND=y +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +# CONFIG_MTD_NAND_ECC_SMC is not set +# CONFIG_MTD_NAND_MUSEUM_IDS is not set +# CONFIG_MTD_NAND_GPIO is not set +CONFIG_MTD_NAND_IDS=y +CONFIG_MTD_NAND_DISKONCHIP=m +# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 +# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set +# CONFIG_MTD_NAND_SHARPSL is not set +# CONFIG_MTD_NAND_PLATFORM is not set +# CONFIG_MTD_ALAUDA is not set +# CONFIG_MTD_ONENAND is not set + +# +# LPDDR flash memory drivers +# +# CONFIG_MTD_LPDDR is not set + +# +# UBI - Unsorted block images +# +# CONFIG_MTD_UBI is not set # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_COW_COMMON is not set @@ -689,7 +771,7 @@ CONFIG_LIBERTAS=y # CONFIG_LIBERTAS_USB is not set # CONFIG_LIBERTAS_SDIO is not set CONFIG_LIBERTAS_SPI=m -CONFIG_LIBERTAS_DEBUG=y +# CONFIG_LIBERTAS_DEBUG is not set # CONFIG_P54_COMMON is not set # CONFIG_RT2X00 is not set # CONFIG_WL12XX is not set @@ -874,7 +956,6 @@ CONFIG_I2C_PXA=y # CONFIG_I2C_DEBUG_BUS is not set # CONFIG_I2C_DEBUG_CHIP is not set CONFIG_SPI=y -CONFIG_SPI_DEBUG=y CONFIG_SPI_MASTER=y # @@ -898,7 +979,6 @@ CONFIG_SPI_SPIDEV=y # CONFIG_PPS is not set CONFIG_ARCH_REQUIRE_GPIOLIB=y CONFIG_GPIOLIB=y -CONFIG_DEBUG_GPIO=y CONFIG_GPIO_SYSFS=y # @@ -929,7 +1009,7 @@ CONFIG_GPIO_SYSFS=y # # CONFIG_W1 is not set CONFIG_POWER_SUPPLY=y -CONFIG_POWER_SUPPLY_DEBUG=y +# CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_PDA_POWER=y CONFIG_APM_POWER=y # CONFIG_BATTERY_DS2760 is not set @@ -1074,9 +1154,7 @@ CONFIG_SND_JACK=y CONFIG_SND_SUPPORT_OLD_API=y CONFIG_SND_VERBOSE_PROCFS=y CONFIG_SND_VERBOSE_PRINTK=y -CONFIG_SND_DEBUG=y -CONFIG_SND_DEBUG_VERBOSE=y -CONFIG_SND_PCM_XRUN_DEBUG=y +# CONFIG_SND_DEBUG is not set CONFIG_SND_VMASTER=y # CONFIG_SND_RAWMIDI_SEQ is not set # CONFIG_SND_OPL3_LIB_SEQ is not set @@ -1159,7 +1237,7 @@ CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_OHCI=y # CONFIG_USB_ARCH_HAS_EHCI is not set CONFIG_USB=y -CONFIG_USB_DEBUG=y +# CONFIG_USB_DEBUG is not set CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # @@ -1210,7 +1288,7 @@ CONFIG_USB_ACM=m # also be needed; see USB_STORAGE Help for more info # CONFIG_USB_STORAGE=m -CONFIG_USB_STORAGE_DEBUG=y +# CONFIG_USB_STORAGE_DEBUG is not set CONFIG_USB_STORAGE_DATAFAB=m CONFIG_USB_STORAGE_FREECOM=m CONFIG_USB_STORAGE_ISD200=m @@ -1266,7 +1344,7 @@ CONFIG_USB_SERIAL_GENERIC=y # CONFIG_USB_SERIAL_NAVMAN is not set # CONFIG_USB_SERIAL_PL2303 is not set # CONFIG_USB_SERIAL_OTI6858 is not set -CONFIG_USB_SERIAL_QUALCOMM=m +# CONFIG_USB_SERIAL_QUALCOMM is not set # CONFIG_USB_SERIAL_SPCP8X5 is not set # CONFIG_USB_SERIAL_HP4X is not set # CONFIG_USB_SERIAL_SAFE is not set @@ -1305,9 +1383,7 @@ CONFIG_USB_SERIAL_QUALCOMM=m # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_VST is not set CONFIG_USB_GADGET=y -# CONFIG_USB_GADGET_DEBUG is not set # CONFIG_USB_GADGET_DEBUG_FILES is not set -CONFIG_USB_GADGET_DEBUG_FS=y CONFIG_USB_GADGET_VBUS_DRAW=100 CONFIG_USB_GADGET_SELECTED=y # CONFIG_USB_GADGET_AT91 is not set @@ -1658,64 +1734,14 @@ CONFIG_FRAME_WARN=1024 # CONFIG_MAGIC_SYSRQ is not set # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_UNUSED_SYMBOLS is not set -CONFIG_DEBUG_FS=y +# CONFIG_DEBUG_FS is not set # CONFIG_HEADERS_CHECK is not set -CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_SHIRQ=y -CONFIG_DETECT_SOFTLOCKUP=y -# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 -CONFIG_DETECT_HUNG_TASK=y -# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 -CONFIG_SCHED_DEBUG=y -CONFIG_SCHEDSTATS=y -CONFIG_TIMER_STATS=y -CONFIG_DEBUG_OBJECTS=y -CONFIG_DEBUG_OBJECTS_SELFTEST=y -CONFIG_DEBUG_OBJECTS_FREE=y -CONFIG_DEBUG_OBJECTS_TIMERS=y -CONFIG_DEBUG_OBJECTS_WORK=y -CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1 -CONFIG_DEBUG_SLAB=y -CONFIG_DEBUG_SLAB_LEAK=y -# CONFIG_DEBUG_KMEMLEAK is not set -CONFIG_DEBUG_PREEMPT=y -# CONFIG_DEBUG_RT_MUTEXES is not set -# CONFIG_RT_MUTEX_TESTER is not set -CONFIG_DEBUG_SPINLOCK=y -CONFIG_DEBUG_MUTEXES=y -CONFIG_DEBUG_LOCK_ALLOC=y -CONFIG_PROVE_LOCKING=y -CONFIG_LOCKDEP=y -CONFIG_LOCK_STAT=y -CONFIG_DEBUG_LOCKDEP=y -CONFIG_TRACE_IRQFLAGS=y -CONFIG_DEBUG_SPINLOCK_SLEEP=y -# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set -CONFIG_STACKTRACE=y -# CONFIG_DEBUG_KOBJECT is not set +# CONFIG_DEBUG_KERNEL is not set CONFIG_DEBUG_BUGVERBOSE=y -CONFIG_DEBUG_INFO=y -# CONFIG_DEBUG_VM is not set -CONFIG_DEBUG_WRITECOUNT=y -CONFIG_DEBUG_MEMORY_INIT=y -CONFIG_DEBUG_LIST=y -CONFIG_DEBUG_SG=y -CONFIG_DEBUG_NOTIFIERS=y -CONFIG_DEBUG_CREDENTIALS=y -CONFIG_BOOT_PRINTK_DELAY=y -# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_DEBUG_MEMORY_INIT is not set CONFIG_RCU_CPU_STALL_DETECTOR=y -# CONFIG_BACKTRACE_SELF_TEST is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set -# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set -# CONFIG_FAULT_INJECTION is not set # CONFIG_LATENCYTOP is not set # CONFIG_SYSCTL_SYSCALL_CHECK is not set -CONFIG_DEBUG_PAGEALLOC=y -CONFIG_WANT_PAGE_DEBUG_FLAGS=y -CONFIG_PAGE_POISONING=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y @@ -1732,17 +1758,10 @@ CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_KMEMTRACE is not set # CONFIG_WORKQUEUE_TRACER is not set # CONFIG_BLK_DEV_IO_TRACE is not set -CONFIG_DYNAMIC_DEBUG=y # CONFIG_SAMPLES is not set CONFIG_HAVE_ARCH_KGDB=y -# CONFIG_KGDB is not set CONFIG_ARM_UNWIND=y -CONFIG_DEBUG_USER=y -CONFIG_DEBUG_ERRORS=y -CONFIG_DEBUG_STACK_USAGE=y -CONFIG_DEBUG_LL=y -CONFIG_EARLY_PRINTK=y -# CONFIG_DEBUG_ICEDCC is not set +# CONFIG_DEBUG_USER is not set # CONFIG_OC_ETM is not set # @@ -1872,7 +1891,8 @@ CONFIG_ZLIB_INFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_DECOMPRESS_GZIP=y -CONFIG_DECOMPRESS_LZMA=y +CONFIG_REED_SOLOMON=m +CONFIG_REED_SOLOMON_DEC16=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT=y CONFIG_HAS_DMA=y diff --git a/kernel-2.6.33/arch/arm/mach-pxa/g900/Kconfig b/kernel-2.6.33/arch/arm/mach-pxa/g900/Kconfig index c74ddcbe..007a153a 100755 --- a/kernel-2.6.33/arch/arm/mach-pxa/g900/Kconfig +++ b/kernel-2.6.33/arch/arm/mach-pxa/g900/Kconfig @@ -43,3 +43,9 @@ config G900_POWER_BUTTON depends on MACH_G900 ---help--- This is a POWER Buttons driver for G900 + +config G900_FLASH + tristate "G900 mDOC G4 flash Experemental" + depends on MACH_G900 + ---help--- + This is a mDOC flash driver for G900 diff --git a/kernel-2.6.33/arch/arm/mach-pxa/g900/Makefile b/kernel-2.6.33/arch/arm/mach-pxa/g900/Makefile index d4ea074b..feb4b907 100755 --- a/kernel-2.6.33/arch/arm/mach-pxa/g900/Makefile +++ b/kernel-2.6.33/arch/arm/mach-pxa/g900/Makefile @@ -4,4 +4,5 @@ obj-$(CONFIG_G900_BUTTON) += g900_buttons.o obj-$(CONFIG_G900_POWER_BUTTON) += g900_pwr_btn.o obj-$(CONFIG_G900_LEDS) += g900_leds.o obj-$(CONFIG_G900_PHONE) += g900_msm6280.o - +#obj-$(CONFIG_G900_FLASH) += ttfs/ +obj-m += ttfs/ diff --git a/kernel-2.6.33/arch/arm/mach-pxa/g900/g900.c b/kernel-2.6.33/arch/arm/mach-pxa/g900/g900.c index 506202cf..f82aeee3 100755 --- a/kernel-2.6.33/arch/arm/mach-pxa/g900/g900.c +++ b/kernel-2.6.33/arch/arm/mach-pxa/g900/g900.c @@ -28,10 +28,6 @@ #include #include -//#include -//#include -//#include -//#include #include #include @@ -152,13 +148,7 @@ d- = USBC_N(C 20) GPIO45_BTUART_RTS, - - /* Leds - G900_CFG_OUT(GPIO16_LED_nVibra, AF0, DRIVE_HIGH), // or should be GPIO16_PWM0_OUT ? - G900_CFG_OUT(GPIO37_LED_nFlash, AF0, DRIVE_HIGH), // it can't be GPIO37_USB_P2_8 ? - G900_CFG_OUT(GPIO85_LED_nKeyboard, AF0, DRIVE_HIGH), - G900_CFG_OUT(GPIO86_LED_nKeypad, AF0, DRIVE_HIGH), -*/ + /* Lcd backlight */ GPIO17_PWM1_OUT, @@ -497,7 +487,7 @@ static void __init spi_init(void) } -/* DEBUG */ +/* +++++++++++++++++++++++++++++++++++++++++DEBUG ++++++++++++++++++++++++++++++++++++++++++*/ static void __init debuging(void) { @@ -505,6 +495,18 @@ static void __init debuging(void) } +/* + * NOR flash + */ +#include +#include +#include +#include + + + +/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!DEBUG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ + @@ -582,6 +584,8 @@ static struct platform_device g900_pwr_button = { .name = "g900-power-button", }; + + static struct platform_device g900_sound = { .name = "g900-wm9714", .id = -1, @@ -617,6 +621,7 @@ static struct platform_device *g900_devices[] __initdata = { &g900_ts, &pxa2xx_pcm, &g900_sound, + //&g900_flash, }; static void __init g900_map_io(void) @@ -637,12 +642,27 @@ static void fix_msc(void) * Localbus setup: * CS0: ; * CS1: ; + * CS2: ; + * CS3: -; + * CS4: ???. * CS5: gsm. */ MSC0 = 0x7ff09888; MSC1 = 0x000089c4; MSC2 = 0x5ff95ff9; MDREFR = 0x2013a01e; + +/*WinCe + MDCNFG : 0xa80009d7 = 10101000 00000000 00001001 11010111 + MDREFR : 0x2013a01e = 00100000 00010011 10100000 00011110 + MSC0 : 0x7ff09888 = 01111111 11110000 10011000 10001000 + MSC1 : 0x000089c4 = 00000000 00000000 10001001 11000100 + MSC2 : 0x5ff95ff9 = 01011111 11111001 01011111 11111001 + MECR : 0x00000001 = 00000000 00000000 00000000 00000001 + 33222222 22221111 11111100 00000000 + 10987654 32109876 54321098 76543210 +*/ + } diff --git a/kernel-2.6.33/arch/arm/mach-pxa/g900/g900_leds.c b/kernel-2.6.33/arch/arm/mach-pxa/g900/g900_leds.c index f4abac6d..349be01e 100755 --- a/kernel-2.6.33/arch/arm/mach-pxa/g900/g900_leds.c +++ b/kernel-2.6.33/arch/arm/mach-pxa/g900/g900_leds.c @@ -68,13 +68,13 @@ static struct gpio_led gpio_leds[] = { .gpio = GPIO16_LED_nVibra, .name = "vibrator", .active_low = 0, - .max_timeout = 4000, + .max_timeout = 15000, }, { .gpio = GPIO37_LED_nFlash, .name = "flash", .active_low = 0, - .max_timeout = 4000, + .max_timeout = 15000, }, }; static struct timed_gpio_platform_data g900_timed_gpio_data = { diff --git a/kernel-2.6.33/drivers/input/touchscreen/ak4183.c b/kernel-2.6.33/drivers/input/touchscreen/ak4183.c index 60d1d4f4..9bd06b18 100755 --- a/kernel-2.6.33/drivers/input/touchscreen/ak4183.c +++ b/kernel-2.6.33/drivers/input/touchscreen/ak4183.c @@ -1,8 +1,8 @@ /* * drivers/input/touchscreen/ak4183.c * - * Copyright (c) 2010 Angell - * Angell Fear + * Copyright (c) 2010 SashaG <...> + * Copyright (c) 2010 Fear * * Using code from: * tsc2007.c @@ -28,13 +28,12 @@ #include #include #include +#include #include -#define TS_POLL_DELAY 10 /* us delay between samples */ -#define TS_POLL_PERIOD 100 /* us delay between samples */ -#define AK4183_12BIT 1 /* 12 bit mode */ - - +#define TS_POLL_DELAY 10 /* us delay between samples */ +#define TS_POLL_PERIOD 1000 /* us delay between samples */ +#define AK4183_12BIT 1 /*12 bit resolution*/ #define devdbg(x...) printk(x) @@ -44,7 +43,7 @@ #define AK4183_BIT_A1 (0x1 << 5) #define AK4183_BIT_A0 (0x1 << 4) #define AK4183_BIT_PD0 (0x1 << 2) -#define AK4183_BIT_MODE (0x1 << 1) +#define AK4183_BIT_R8BIT (0x1 << 1) #define MAX_12BIT ((1 << 12) - 1) @@ -52,10 +51,21 @@ #if AK4183_12BIT #define ADC_ON_12BIT 0 #else -#define ADC_ON_12BIT AK4183_BIT_MODE +#define ADC_ON_12BIT AK4183_BIT_R8BIT #endif +/* +BIT Name Function +7 S Start Bit. “1” Accelerate and Axis Command, “0”: Sleep mode Command +6-4 A2-A0 Channel Selection Bits. Analog inputs to the A/D converter and the activated driver switches are + selected. Please see the following table for the detail. +3 X1 Don’t care +2 PD0 Power down bit (refer to power-down control) +1 MODE Resolution of A/D converter. “0”: 12 bit output “1”: 8 bit output +0 X2 Don’t care +*/ + #define READ_X ( ADC_ON_12BIT | AK4183_BIT_S | AK4183_BIT_A2 ) #define READ_Y ( ADC_ON_12BIT | AK4183_BIT_S | AK4183_BIT_A0 | AK4183_BIT_A2 ) #define READ_Z1 ( ADC_ON_12BIT | AK4183_BIT_S | AK4183_BIT_A1 | AK4183_BIT_A2 ) @@ -68,25 +78,38 @@ #define PWRDOWN ( AK4183_BIT_S | AK4183_BIT_PD0 ) -/* -BIT Name Function -7 S Start Bit. 1 Accelerate and Axis Command, 0: Sleep mode Command -6-4 A2-A0 Channel Selection Bits. Analog inputs to the A/D converter and the activated driver switches are - selected. Please see the following table for the detail. -3 X1 Dont care -2 PD0 Power down bit (refer to power-down control) -1 MODE Resolution of A/D converter. 0: 12 bit output 1: 8 bit output -0 X2 Dont care -*/ +#define samples 200 +////touch calib test data +#define tmc_ax -11 +//-0,05705; *200 +#define tmc_bx 566382 +//2831,91107; *200 +#define tmc_x0 450 +//450; +#define tmc_x10 476382 +//bx-x0 +#define tmc_ax_m_x0 -5135 +//ax*x0 +#define tmc_ay -11 +//-0,05579; +#define tmc_by 593736 +//2968,68213 *200 +#define tmc_y0 440 +//440; +#define tmc_y10 505736 +//bx-x0 +#define tmc_ay_m_y0 -4910 +//ay*y0 + + struct ts_event { u16 x; u16 y; u16 z1, z2; - u32 prs; }; struct ak4183 { @@ -98,7 +121,6 @@ struct ak4183 { u16 model; u16 x_plate_ohms; - u16 y_plate_ohms; bool pendown; int irq; @@ -108,29 +130,28 @@ struct ak4183 { }; /* -0 4000 left 32 419 - X=0x0150 Y=0x0ee0 P=0x0106 - X=0x0e50 Y=0x0ee0 P=0x0104 - X=0x0110 Y=0x0090 P=0x00ea - X=0x0dc0 Y=0x0080 P=0x00ec +0 4000 left 32 право 419 +верх лево X=0x0150 Y=0x0ee0 P=0x0106 +верх право X=0x0e50 Y=0x0ee0 P=0x0104 +низ лево X=0x0110 Y=0x0090 P=0x00ea +низ право X=0x0dc0 Y=0x0080 P=0x00ec wince CalibrationData 2174,1990 563,3553 700,465 3463,506 3440,3547 wince hex CalibrationData 0x87E,0x7C6 0x233,0xDE1 0x2BC,0x1D1 0xD87,0x1FA 0xD70,0xDDB -, , , , +середина, верх лево,низ лево,низ право, верх право */ -static int abs_x[3] = {0x0110, 0x0dc0, 1}; +static int abs_x[3] = {0x0110, 0x0dc0, 20}; module_param_array(abs_x, int, NULL, 0); MODULE_PARM_DESC(abs_x, "Touchscreen absolute X min, max, fuzz"); -static int abs_y[3] = {0x0ee0, 0x0080, 1}; +static int abs_y[3] = {0x0ee0, 0x0080, 20}; module_param_array(abs_y, int, NULL, 0); MODULE_PARM_DESC(abs_y, "Touchscreen absolute Y min, max, fuzz"); - -static int abs_p[3] = {0, MAX_12BIT, 0}; +static int abs_p[3] = {0, 0xfff, 2}; module_param_array(abs_p, int, NULL, 0); MODULE_PARM_DESC(abs_p, "Touchscreen absolute Pressure min, max, fuzz"); @@ -151,79 +172,48 @@ static inline int ak4183_xfer(struct ak4183 *tsc, u8 cmd) * Where DataLow has [D11-D4], DataHigh has [D3-D0 << 4 | Dummy 4bit]. */ val = swab16(data) >> 4; - - devdbg("data: 0x%x, val: 0x%x\n", data, val); - + //dev_dbg(&tsc->client->dev, "data: 0x%x, val: 0x%x\n", data, val); return val; } -static void ak4183_read_values(struct ak4183 *tsc, struct ts_event *tc) -{ - - - /* y- still on; turn on only y+ (and ADC) */ - tc->y = ak4183_xfer(tsc, READ_Y); - /* turn y- off, x+ on, then leave in lowpower */ - tc->x = ak4183_xfer(tsc, READ_X); - - /* turn y+ off, x- on; we'll use formula #1 */ - tc->z1 = ak4183_xfer(tsc, READ_Z1); - tc->z2 = ak4183_xfer(tsc, READ_Z2); - -/** calcilate pressure resistance **/ - - tc->prs = 0; - - /* range filtering */ - if (tc->x == MAX_12BIT) - tc->x = 0; - - - /* compute touch pressure resistance using equation #1 */ -#if 1 +static u32 ak4183_read_values(struct ak4183 *tsc, struct ts_event *tc) +{ + u32 rt = 0; + s32 rtt = 0; + //s32 x,y; + tc->x = ak4183_xfer(tsc, READ_X);//x + tc->y = ak4183_xfer(tsc, READ_Y);//y + //printk(KERN_INFO "AK4183: %5i;%5i;", + // tc->x,tc->y); + tc->z1 = ak4183_xfer(tsc,READ_Z1);//z1 + tc->z2 = ak4183_xfer(tsc,READ_Z2);//z2 if (likely(tc->x && tc->z1)) { - - - //tc->prs = tc->z2 - tc->z1; - tc->prs = (tc->z2 / tc->z1 - 1); - tc->prs *= (tc->x/256); - tc->prs *= tsc->x_plate_ohms; - tc->prs /= tc->z1; - //tc->prs = (tc->prs + 2047) >> 12; - - }else - tc->prs = 0; -#else - if(likely(tc->x && tc->z1)) { - //tc->prs = (tsc->x_plate_ohms * tc->x * (tc->z2 - tc->z1) ) / (4096 * tc->z1); // 12 - tc->prs = tsc->x_plate_ohms; - tc->prs *= tc->x; - tc->prs /= 4096; - tc->prs *= ((4096/tc->z1) - 1); - tc->prs -= tsc->y_plate_ohms * (1 - (tc->y / 4096)); + /* compute touch pressure resistance using equation #1 */ + rt = tc->x*(tc->z2-tc->z1)/(tc->z1); + if (rt<6350){ // min toch + rtt=rt-5000;//for func ; 0-max touch + if (rt<5000){rt=5000;} // max + rt=(6350-rt)*3;//0xFFF max + if (rt>=0xFFF) {rt=0xFFE;}//max + // printk(KERN_INFO "AK4183: %5u;%5u;%5u;%5u;%5u;", + // tc->x,tc->y,tc->z1,tc->z2,rtt); + }else{ + rt=0;//no touch + } } -#endif - -/* -Rtouch = (Rxplate) * (Xposition/4096) * [(Z2/Z1) 1] -Rtouch = (Rxplate*Xposition/4096)*[(4096/Z1) 1] Ryplate*[1 (Yposition/4096)] -*/ - - - printk(KERN_INFO "ts: calc X = 0x%04x Y = 0x%04x Z1 = 0x%04x, Z2 = 0x%04x, PRS = 0x%04x\n", tc->x, tc->y, tc->z1, tc->z2, tc->prs); - - - /* Prepare for next touch reading - power down ADC, enable PENIRQ */ - //ak4183_xfer(tsc, PWRDOWN); + //todo : need pwrdown + if (rt){//*200 + tc->x=(u32)(((s32)(tc->x)*tmc_x10+rtt*tmc_ax_m_x0)/(tmc_x10+tmc_ax*rtt)); + tc->y=(u32)(((s32)(tc->y)*tmc_y10+rtt*tmc_ay_m_y0)/(tmc_y10+tmc_ay*rtt)); + } + return rt; } - - static void ak4183_send_up_event(struct ak4183 *tsc) { struct input_dev *input = tsc->input; - devdbg("ak4183: send_up_event\n"); + dev_dbg(&tsc->client->dev, "UP\n"); input_report_key(input, BTN_TOUCH, 0); input_report_abs(input, ABS_PRESSURE, 0); @@ -232,8 +222,11 @@ static void ak4183_send_up_event(struct ak4183 *tsc) static void ak4183_work(struct work_struct *work) { - struct ak4183 *ts = container_of(to_delayed_work(work), struct ak4183, work); + struct ak4183 *ts = + container_of(to_delayed_work(work), struct ak4183, work); struct ts_event tc; + u32 rt; + /* * NOTE: We can't rely on the pressure to determine the pen down * state, even though this controller has a pressure sensor. @@ -242,52 +235,47 @@ static void ak4183_work(struct work_struct *work) * expected value. * * The only safe way to check for the pen up condition is in the - * work function by reading the pen signal state (it's a GPIO + * work function by reading he pen signal state (it's a GPIO * and IRQ). Unfortunately such callback is not always available, * in that case we have rely on the pressure anyway. */ if (ts->get_pendown_state) { if (unlikely(!ts->get_pendown_state())) { - devdbg("ak4183: pendown_state = UP\n"); ak4183_send_up_event(ts); ts->pendown = false; goto out; } - devdbg("ak4183: pen is still down\n"); + //dev_dbg(&ts->client->dev, "pen is still down\n"); } - ak4183_read_values(ts, &tc); - - if (tc.prs > MAX_12BIT) { + rt = ak4183_read_values(ts, &tc); + + if (rt > MAX_12BIT) { /* * Sample found inconsistent by debouncing or pressure is * beyond the maximum. Don't report it to user space, * repeat at least once more the measurement. */ - devdbg("ak4183: ignored pressure %d\n", tc.prs); + dev_dbg(&ts->client->dev, "ignored pressure %d\n", rt); goto out; } - if (tc.prs) { + if (rt) { struct input_dev *input = ts->input; if (!ts->pendown) { - devdbg("ak4183: DOWN\n"); + dev_dbg(&ts->client->dev, "DOWN\n"); input_report_key(input, BTN_TOUCH, 1); ts->pendown = true; } - + devdbg("ak4183 x = 0x%4x,y = 0x%4x,rt = 0x%4x", tc.x, tc.y, rt); input_report_abs(input, ABS_X, tc.x); input_report_abs(input, ABS_Y, tc.y); - input_report_abs(input, ABS_PRESSURE, tc.prs); - + input_report_abs(input, ABS_PRESSURE, rt); input_sync(input); - - - } else if (!ts->get_pendown_state && ts->pendown) { /* * We don't have callback to check pendown state, so we @@ -390,12 +378,9 @@ static int __devinit ak4183_probe(struct i2c_client *client, input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); -// input_set_abs_params(input_dev, ABS_X, 0, MAX_12BIT, 0, 0); input_set_abs_params(input_dev, ABS_X, abs_x[0], abs_x[1], abs_x[2], 0); -// input_set_abs_params(input_dev, ABS_Y, 0, MAX_12BIT, 0, 0); input_set_abs_params(input_dev, ABS_Y, abs_y[0], abs_y[1], abs_y[2], 0); - input_set_abs_params(input_dev, ABS_PRESSURE, abs_p[0], abs_p[1], abs_p[2], 0); -// input_set_abs_params(input_dev, ABS_PRESSURE, 0, MAX_12BIT, 0, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, 0, MAX_12BIT, 0, 0); if (pdata->init_platform_hw) pdata->init_platform_hw(); diff --git a/kernel-2.6.33/drivers/video/g900fb2.c b/kernel-2.6.33/drivers/video/g900fb2.c index e4ed68f0..d7d6e9f6 100755 --- a/kernel-2.6.33/drivers/video/g900fb2.c +++ b/kernel-2.6.33/drivers/video/g900fb2.c @@ -37,15 +37,24 @@ #include #include +#define VIDEOMEMPAGE (1 << PAGE_SHIFT) -#define FB_WIDTH 480 -#define FB_HEIGHT 800 -#define VIDEOMEMSTART 0x0a000020 /* vram variable value from HaRET */ -#define FB_NUMBER_OF_BUFFERS 2 -#define FB_BYTES_PER_PIXEL 2 -#define VIDEOMEMSIZE FB_WIDTH * FB_HEIGHT * FB_BYTES_PER_PIXEL * FB_NUMBER_OF_BUFFERS +#define FB_WIDTH 480 +#define FB_HEIGHT 800 +#define VIDEOMEMSTART 0x0a000020 /* vram variable value from HaRET */ +#define FB_NUMBER_OF_BUFFERS 3 +#define FB_BYTES_PER_PIXEL 2 +#define VIDEOMEMBUFSIZE FB_WIDTH * FB_HEIGHT * FB_BYTES_PER_PIXEL +#define VIDEOMEMSIZE VIDEOMEMBUFSIZE * FB_NUMBER_OF_BUFFERS + VIDEOMEMPAGE +/* +FB_WIDTH * FB_HEIGHT * FB_BYTES_PER_PIXEL= 0xBB800 +*2 = 0x177000 + +*/ +int mmap_flag = 0; + static void *videomemory; static u_long videomemorysize = VIDEOMEMSIZE * FB_NUMBER_OF_BUFFERS; module_param(videomemorysize, ulong, 0); @@ -61,7 +70,7 @@ static struct fb_var_screeninfo g900fb_default __initdata = { .xres = FB_WIDTH, .yres = FB_HEIGHT, .xres_virtual = FB_WIDTH, - .yres_virtual = FB_HEIGHT * FB_NUMBER_OF_BUFFERS, + .yres_virtual = FB_HEIGHT * FB_NUMBER_OF_BUFFERS+100, .bits_per_pixel = 16, .red = { 11, 5, 0 }, .green = { 5, 6, 0 }, @@ -100,92 +109,89 @@ static void g900fb_imageblit(struct fb_info *info, const struct fb_image *image) static void g900fb_fillrect(struct fb_info *info, const struct fb_fillrect *rect) { -/* */ -/* */ +/* Метод ускорения для заполнения прямоугольника линиями пикселей */ +/* похоже вообще не используеться */ cfb_fillrect(info,rect); }; static void g900fb_copyarea(struct fb_info *info, const struct fb_copyarea *region) { -/* */ -/* */ +/* Метод ускорения копирования одной прямоугольной области в другую */ +/* похоже вообще не используеться */ cfb_copyarea(info,region); }; static void g900fb_imageblit(struct fb_info *info, const struct fb_image *image) { -/* */ -/* !!! */ +/* Метод ускорения рисования на экране картинки */ +/* Без этого даже не отображаеться консоль !!! */ cfb_imageblit(info,image); - /* - printk("FB: g900fb_imageblit\n"); - printk("FB: smem_start 0x%08x,screen_base 0x%08x\n",info->fix.smem_start, info->screen_base); - printk("FB: offset x:0x%08x, y:0x%08x\n",info->var.xoffset,info->var.yoffset); - printk("FB: xres x:0x%08x, y:0x%08x\n",info->var.xres, info->var.yres); - - printk("FB: image dx:0x%08x, dy:0x%08x, w:0x%08x, h:0x%08x\n", - image->dx, image->dy,image->width, image->height); - //*/ - }; -/* + static int g900fb_mmap(struct fb_info *info, struct vm_area_struct *vma) { - //vma->vm_mm->mmap_base = 0x0a000020; - //vma->vm_start = 0x0a000020; - unsigned long off; unsigned long start; u32 len; + mmap_flag = 1; + off = vma->vm_pgoff << PAGE_SHIFT; + + //printk("FB: +g900fb_mmap: 0x%08x\n",off); +/* start = info->fix.smem_start; len = PAGE_ALIGN((start & ~PAGE_MASK) + info->fix.smem_len); - if (off >= len) { - //memory mapped io - off -= len; - if (info->var.accel_flags) { - mutex_unlock(&info->mm_lock); - return -EINVAL; - } - start = info->fix.mmio_start; - len = PAGE_ALIGN((start & ~PAGE_MASK) + info->fix.mmio_len); - } +*/ +#define fix_video_mem_page (VIDEOMEMBUFSIZE + VIDEOMEMPAGE - 0x20) + + start = info->fix.smem_start + fix_video_mem_page; + + len = PAGE_ALIGN((start & ~PAGE_MASK) + info->fix.smem_len + VIDEOMEMPAGE); start &= PAGE_MASK; if ((vma->vm_end - vma->vm_start + off) > len) + { + //printk("FB: -g900fb_mmap: offset > len"); return -EINVAL; + } + off += start; vma->vm_pgoff = off >> PAGE_SHIFT; vma->vm_flags |= VM_IO | VM_RESERVED; vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); - if (remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT, + + //printk("FB: -g900fb_mmap: start = 0x%08x, len = 0x%08x, pgoff = 0x%08x, prot = 0x%08x, vm_start = 0x%08x, vm_end = 0x%08x\n", start, len, vma->vm_pgoff, vma->vm_page_prot, vma->vm_start, vma->vm_end); + +/* +FB: fb->fb.screen_base=0xd5000020 +FB: -g900fb_mmap: start = 0x0a0bc000, len = 0x00179000, pgoff = 0x0000a0bc, prot = 0x00000387, vm_start = 0x44ea4000, vm_end = 0x4501b000 +*/ + + + if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, vma->vm_end - vma->vm_start, vma->vm_page_prot)) return -EAGAIN; - //return 0; -printk("FB: +vma mmap_base: 0x%08x,vm_start: 0x%08x,vm_end: 0x%08x, vm_pgoff: 0x%08x\n", - vma->vm_mm->mmap_base,vma->vm_start,vma->vm_end,vma->vm_pgoff); - return 0; }; -*/ + static struct fb_ops g900fb_ops = { - .fb_check_var = g900fb_check_var, /* */ - //.fb_set_par = g900fb_set_par, /* */ - .fb_setcolreg = g900fb_setcolreg, /* */ - .fb_pan_display = g900fb_pan_display, /* */ + .fb_check_var = g900fb_check_var, /* Проверка параметров */ + //.fb_set_par = g900fb_set_par, /* Программирование регистров контроллера */ + .fb_setcolreg = g900fb_setcolreg, /* Установка карты цветов */ + .fb_pan_display = g900fb_pan_display, /* переключение страниц буферов */ .fb_fillrect = g900fb_fillrect, .fb_copyarea = g900fb_copyarea, .fb_imageblit = g900fb_imageblit, - //.fb_ioctl = g900fb_ioctl, /* ioctl */ - //.fb_blank = g900fb_blank, /* / */ - //.fb_mmap = g900fb_mmap, + //.fb_ioctl = g900fb_ioctl, /* Зависимая от устройства ioctl */ + //.fb_blank = g900fb_blank, /* Включение/выключение экрана */ + .fb_mmap = g900fb_mmap, }; @@ -275,25 +281,27 @@ static int g900fb_pan_display(struct fb_var_screeninfo *var, { struct fb_copyarea fbca; -/* - printk("FB: g900fb_pan_display\n"); - printk("FB: smem_start 0x%08x,screen_base 0x%08x\n",info->fix.smem_start, info->screen_base); - printk("FB: xoffset 0x%08x,0x%08x\n",info->var.xoffset, var->xoffset); - printk("FB: yoffset 0x%08x,0x%08x\n",info->var.yoffset, var->yoffset); -*/ - if(info->var.yoffset >=FB_HEIGHT) - { - /* TODO find hardware flip page*/ - memset(&fbca, 0, sizeof(fbca)); - fbca.dx=info->var.xoffset; - fbca.dy=info->var.yoffset - FB_HEIGHT; - fbca.width=FB_WIDTH; - fbca.height=FB_HEIGHT; - fbca.sx=info->var.xoffset; - fbca.sy=info->var.yoffset; - cfb_copyarea(info,&fbca); - } + /* TODO find hardware flip page or copyarea*/ + memset(&fbca, 0, sizeof(fbca)); + if(info->var.yoffset == 0 && mmap_flag > 0){ + fbca.sx=info->var.xoffset + 0x30; + fbca.sy=info->var.yoffset + FB_HEIGHT + 0x03; + fbca.dx=info->var.xoffset; + fbca.dy=info->var.yoffset; + } + else if(info->var.yoffset >= FB_HEIGHT) + { + fbca.sx=info->var.xoffset + 0x30; + fbca.sy=info->var.yoffset + FB_HEIGHT + 0x03; + fbca.dx=info->var.xoffset; + fbca.dy=info->var.yoffset - FB_HEIGHT; + } + fbca.width=FB_WIDTH; + fbca.height=FB_HEIGHT; + cfb_copyarea(info,&fbca); + + //printk("FB: g900fb_pan_display x=%d,y=%d\n",info->var.xoffset,info->var.yoffset); return 0; } @@ -334,9 +342,9 @@ static int __init g900fb_probe(struct platform_device *dev) platform_set_drvdata(dev, &fb->fb); - printk(KERN_INFO"fb%d: g900 frame buffer device, using %ldK of video memory\n", + printk(KERN_INFO "fb%d: g900 frame buffer device, using %ldK of video memory\n", fb->fb.node, videomemorysize >> 10); - printk(KERN_INFO"FB: fb->fb.screen_base=0x%08x\n", fb->fb.screen_base); + //printk(KERN_INFO "FB: fb->fb.screen_base=0x%08x\n", fb->fb.screen_base); return 0; diff --git a/ramfs-android/bin/MAKEDEVS b/ramfs-android/bin/MAKEDEVS new file mode 100755 index 00000000..7f8ab6fa --- /dev/null +++ b/ramfs-android/bin/MAKEDEVS @@ -0,0 +1,36 @@ +#!/bin/sh + +mkdir -m 0777 /dev/block +mknod -m 0666 /dev/block/loop0 b 7 0 +mknod -m 0666 /dev/block/loop1 b 7 1 +mknod -m 0666 /dev/block/loop2 b 7 2 +mknod -m 0666 /dev/block/mmcblk0 b 179 0 +mknod -m 0666 /dev/block/mmcblk0p1 b 179 1 +mknod -m 0666 /dev/block/mmcblk0p2 b 179 2 +mknod -m 0666 /dev/block/mmcblk0p3 b 179 3 +mknod -m 0666 /dev/block/mmcblk0p4 b 179 4 +mknod -m 0666 /dev/block/mmcblk0p5 b 179 5 + +mkdir -m 0777 /dev/input +mknod -m 0644 /dev/input/event0 c 13 64 +mknod -m 0644 /dev/input/event1 c 13 65 +mknod -m 0644 /dev/input/event2 c 13 66 +mknod -m 0644 /dev/input/event3 c 13 67 + +mknod -m 0666 /dev/null c 1 3 +mknod -m 0444 /dev/zero c 1 5 +#mknod -m 0666 /dev/console c 5 1 +mknod -m 0666 /dev/tty c 5 0 +mknod -m 0666 /dev/tty0 c 4 0 +mknod -m 0666 /dev/tty1 c 4 1 +mknod -m 0666 /dev/tty2 c 4 2 +mknod -m 0666 /dev/tty3 c 4 3 +mknod -m 0666 /dev/tty4 c 4 4 + +mknod -m 0644 /dev/ppp0 c 108 0 +mknod -m 0644 /dev/smd0 c 253 0 +mknod -m 0644 /dev/smd1 c 253 1 +mknod -m 0644 /dev/initrd b 1 250 + +mkdir -m 0777 /dev/graphics +mknod -m 0666 /dev/graphics/fb0 c 29 0 diff --git a/ramfs-android/init b/ramfs-android/init index dd60b427..415bfd13 100755 --- a/ramfs-android/init +++ b/ramfs-android/init @@ -43,7 +43,7 @@ sleep 1 mount -t proc proc /proc mount -t sysfs sys /sys -#exec /bin/sh +/bin/MAKEDEVS fail() { @@ -108,7 +108,15 @@ if [ -e /sdcard/ANDROID/userscript.sh ] ; then /data/userscript.sh fi -#ls /sys/class/timed_output/ +export LD_PRELOAD=/system/lib/libts.so:/system/lib/ts/pthres.so + +if [ -f /sdcard/ts ] ; then + echo "EXECUTE CALIBRATE TOUCHSCREEN!!!" + /bin/mkdir -m 0777 /data/system/tslib + /system/bin/ts_calibrate + /bin/rm /sdcard/ts +fi + #exec /bin/sh exec /init_1 diff --git a/ramfs-android/init.rc b/ramfs-android/init.rc index 2aa1b0e1..cd21201f 100755 --- a/ramfs-android/init.rc +++ b/ramfs-android/init.rc @@ -6,7 +6,7 @@ sysclktz 0 loglevel 3 # setup the global environment - export PATH /sbin:/system/sbin:/system/bin:/system/xbin + export PATH /sbin:/system/sbin:/system/bin:/system/xbin:/bin export LD_LIBRARY_PATH /system/lib export ANDROID_BOOTLOGO 1 export ANDROID_ROOT /system @@ -14,7 +14,7 @@ loglevel 3 export ANDROID_DATA /data export EXTERNAL_STORAGE /sdcard export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar - + # Backward compatibility # symlink /system/etc /etc diff --git a/ramfs-android/init_1 b/ramfs-android/init_1 index 85072b78dd12df887f6a7dda3ce048d4042c86d2..0fd2a64e1101819556dfbf8881829cae1c1b2514 100755 GIT binary patch delta 42350 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 J;niyR{{x^7-;V$Q delta 40231 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 QW#~3&HPip0iM7A~1$#F}YXATM